HighGUI图形用户界面初步:创建滑动条(createTrackbar函数)【两幅图像的Alpha混合】
滑动条是opencv动态调节参数特别好用的一种工具,它依附于窗口而存在。
createTrackbar函数用于创建一个可以调整数值的滑动条(常常也被称作轨迹条),并将滑动条附加到指定的窗口上,使用起来很方便。需要记住,它往往会和一个回调函数配合起来使用。先看下它的函数原型,如下:
C++: int createTrackbar (conststring& trackbarname,conststring& winname,int* value, int count,TrackbarCallback onChange=0 , void* userdata=0) ;
第一个参数,const string&类型的 trackbarname,轨迹条的名字,用来代表我们创建的轨迹条。
第二个参数,const string&类型的winname,窗口的名字,表示这个轨迹条会依附到哪个窗口上,即对应namedWindow()创建窗口时填的某一个窗口名。
第三个参数,int*类型的value,一个指向整型的指针,表示滑块的位置。在创建时,滑块的初始位置就是该变量当前的值。
第四个参数,int类型的count,表示滑块可以达到的最大位置的值。滑块最小位置的值始终为0。
第五个参数,TrackbarCallback类型的onChange,它有默认值0。这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为void XxXX(int,void*);,其中第一个参数是轨迹条的位置,第二个参数是用户数据(看下面的第六个参数)。如果回调是NULL指针,则表示没有回调函数的调用,仅第三个参数value有变化。
第六个参数,void*类型的userdata,也有默认值0。这个参数是用户传给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value实参是全局变量的话,完全可以不去管这个userdata参数。
在函数讲解之后,给大家一个createTrackbar 函数使用的小例子作为参照。
创建轨迹条
createTrackbar("对比度: ","【效果图窗口】", &g_ncontrastvalue,
300, on_Change) ;
其中:g_nContrastvalue为全局的整型变量,on_Change为回调函数的函数名(在C/C++中,函数名为指向函数地址的指针)
示例程序:两幅图像的Alpha混合
代码如下:
#include#include //opencv highgui 头文件 #include //opencv 图像处理头文件 #include #include #include using namespace cv; #define WINDOW_NAME "[线性混合示例]" //为窗口标题定义的宏 //全局变量的声明 const int g_nMaxAlphaValue = 100;//Alpha值得最大值 int g_nAlphaValueS1ider;//滑动条对应的变量 double g_dAlphaValue; double g_dBetaValue; //声明存储图像的变量 Mat g_srcImage1; Mat g_srcImage2; Mat g_dstImage; //响应滑动条的回调函数 on_Trackbar void on_Trackbar(int, void*) { //求出当前alpha值相对于最大值的比例 g_dAlphaValue = (double)g_nAlphaValueS1ider /g_nMaxAlphaValue; //则beta值为1 减去alpha值 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() { cv::utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);//控制台不在输出日志文件 //加载图像(两图像的尺寸需相同) g_srcImage1 = imread ( "E:/pictures/slg1.png"); g_srcImage2 = imread ( "E:/pictures/slg2.png"); if (!g_srcImage1.data) { printf("读取第一幅图片错误,请确定目录下是否有imread函数指定图片存在~n"); return -1; } if (!g_srcImage2.data) { printf("读取第二幅图片错误,请确定目录下是否有imread函数指定图片存在~n"); return -1; } imshow("无畏1", g_srcImage1); imshow("无畏2", g_srcImage2); //设置滑动条初值为70 g_nAlphaValueS1ider = 70; //创建窗体 namedWindow(WINDOW_NAME, 1); //在创建的窗体中创建一个滑动条控件 char TrackbarName [50] ; sprintf_s(TrackbarName, "透明值%d", g_nMaxAlphaValue); createTrackbar(TrackbarName,WINDOW_NAME, &g_nAlphaValueS1ider, g_nMaxAlphaValue, on_Trackbar); //结果在回调函数中显示 on_Trackbar(g_nAlphaValueS1ider, 0); //按任意键退出 waitKey(0); return 0; }
运行此程序,我们可以通过调节滑动条的位置,来得到不同的混合效果,如图:
其中:
1是:控制台
2是:图一
3是:图二
4是:有滑动条的混合图
5是:滑动条(控制透明度)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)