图像窗口滑动条,顾名思义就是在显示图像的窗口中创建能够通过滑动改变数值的滑动条。有时我们需要动态调节某些参数,以使图像处理的效果更加明显,能够改变参数数值的滑动条可以很好的胜任这项工作。OpenCV 4中通过**createTrackbar()**函数在显示图像的窗口上创建滑动条,该函数的函数原型在代码清单3-54中给出。
int cv::createTrackbar(const String & trackbarname,
const String & winname,
int * value,
int count,
TrackbarCallback onChange = 0,
void * userdata = 0
)
- trackbarname:滑动条的名称
- winname:创建滑动条窗口的名称。
- value:指向整数变量的指针,该指针指向的值反映滑块的位置,创建后,滑块位置由此变量定义。
- count:滑动条的最大取值。
- onChange:每次滑块更改位置时要调用的函数的指针。该函数应该原型为void Foo(int,void
*);,其中第一个参数是轨迹栏位置,第二个参数是用户数据。如果回调是NULL指针,则不会调用任何回调,只更新数值。 - userdata:传递给回调函数的可选参数
该函数能够在图像窗口的上方创建一个范围从0开始的整数滑动条,由于滑动条只能输出整数,如果需要得到小数,必须进行后续处理,例如输出值除以10得到含有1位小数的数据。函数第一个参数是滑动条的名称,第二个参数是创建滑动条的图像窗口的名称。第三个参数是指向整数变量的指针,该指针指向的值反映滑块的位置,在创建滑动条时该参数确定了滑动块的初始位置,当滑动条创建完成后,该指针指向的整数随着滑块的移动而改变。第四个参数是滑动条的最大取值。第五个参数是每次滑块更改位置时要调用的函数的指针。该函数应该原型为void Foo(int,void * ),其中第一个参数是轨迹栏位置,第二个参数是用户数据,如果回调是NULL指针,则不会调用任何回调,只更新数值。最后一个参数是传递给回调函数的void *类型数据,如果使用的第三个参数是全局变量,可以不用忽略最后一个参数,使用参数的默认值即可。
为了了解滑动条动态改变参数的方法以及动态参数在程序中的作用,在代码清单3-55中给出了通过滑动条改变图像亮度的示例程序。程序中滑动条控制图像亮度系数,将图像原始灰度值乘以亮度系数得到最终的图像。为了使图像亮度变化比较平滑,将滑动条参数除以100以得到含有两位小数的亮度系数。为了保证每次亮度的改变都是在原始图像的基础上,设置了两个表示图像的img1、 img2全局变量,其中img1表示原始图像,img2表示亮度改变后的图像。程序中,通过拖拽滑动块可以动态的改变图像的亮度,运行结果在图3-34中给出。
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
#define WINDOW_NAME "线性混合"
//变量声明
const int g_nMaxAlphaValue = 1000; //Alpha的最大值
int g_nAlphaValuesSlider; //滑动条对应的变量
double g_dAlpaValue;
double g_dBetaValue;
//声明存储图像的变量
//g_srcImage1和g_srcImage2的图片大小必须一样,否则会报错
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;
//响应滑动条的回调函数
void on_Trackbar(int, void *)
{
//求出当前alpha值对于最大值的比例
g_dAlpaValue = (double)g_nAlphaValuesSlider / g_nMaxAlphaValue;
//求出第二张图片的权重
g_dBetaValue = (1.0 - g_dAlpaValue);
//线性混合
addWeighted(g_srcImage1, g_dAlpaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
//显示效果图
imshow(WINDOW_NAME, g_dstImage);
}
int main()
{
g_srcImage1 = imread("699342568.jpg");
g_srcImage2 = imread("699342568.jpg");
if (!g_srcImage1.data)
{
printf("第一张读取失败\n");
return -1;
}
if (!g_srcImage2.data)
{
printf("第二张读取失败\n");
return -1;
}
//设置滑动条的初始位置
g_nAlphaValuesSlider = 50;
//创建窗体
namedWindow(WINDOW_NAME);
//在创建窗体中创建一个滑动条
char TranckbarName[50] = "透明值100";
createTrackbar(TranckbarName, WINDOW_NAME, &g_nAlphaValuesSlider, g_nMaxAlphaValue, on_Trackbar,0);
on_Trackbar(g_nAlphaValuesSlider, 0);
waitKey(0);
return 0;
}