滑动条(Trackbar)是OpenCV动态调节参数特别好用的一种工具。
1. createTrackbar:用于创建一个可以调节整数值的滑动条
int createTrackbar(const String& trackbarname, const String& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
参数1:轨迹条的名字,用来代表创建的轨迹条;
参数2:窗口的名字,表示这个轨迹条会依附在哪个窗口上;
参数3:一个指向整型的指针,表示滑块的位置;
参数4:表示滑块可以达到的最大值的位置,滑块的最小值始终为0;
参数5:这是一个指向回调函数的指针,默认值为0,每次滑块位置改变时,这个函数都会进行回调。函数原型为void XXXX(int, void*)
;
参数6:void*
类型的userdata
,默认值也为0,是用户回传给回调函数的数据,用来处理轨迹条事件,如果使用的第三个参数value
实参是全局变量的话,完全可以不用管这个userdata
参数。
2. 测试示例
#include "opencvpro/cvtpro.h" //头文件所在位置
#define WINDOW_NAME "[线性混合示例]"
#define G_NMAXALPHAVALUE 100 //Alpha的最大值
int g_nAlphaValueSlide; //滑动条对应的变量
double g_dAlphaValue;
double g_dBetaValue;
//声明存储图像的变量
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;
void on_Trackbar(int, void*)
{
g_dAlphaValue = (double)g_nAlphaValueSlide / G_NMAXALPHAVALUE;
g_dBetaValue = 1.0 - g_dAlphaValue;
//根据alpha和beta值进行线性混合
addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
imshow(WINDOW_NAME, g_dstImage);
}
int main()
{
g_srcImage1 = imread("1.png");
g_srcImage2 = imread("2.png");
if (!g_srcImage1.data)
cout << "read pic1 error." << endl;
if (!g_srcImage2.data)
cout << "read pic2 error." << endl;
g_nAlphaValueSlide = 70;
namedWindow(WINDOW_NAME, 1);
string TrackbarName;
TrackbarName = "透明度" + to_string(G_NMAXALPHAVALUE);
createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlide,
G_NMAXALPHAVALUE, on_Trackbar);
on_Trackbar(g_nAlphaValueSlide, 0);
waitKey(0);
}
3. 测试结果