主要讲解createTrackbar的使用,以及通过参数避免使用全局变量
函数原型:
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,表示滑块可以达到的最大位置的值。PS:滑块最小的位置的值始终为0。
第五个参数,TrackbarCallback类型的onChange,首先注意他有默认值0。
这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。
并且这个函数的原型必须为void XXXX(int,void*);
其中第一个参数是轨迹条的位置,第二个参数是用户数据(看下面的第六个参数)。
如果回调是NULL指针,表示没有回调函数的调用,仅第三个参数value有变化。
第六个参数,void*类型的userdata,他也有默认值0。这个参数是用户传给回调函数的数据,用来处理轨迹条事件。
如果使用的第三个参数value实参是全局变量的话,完全可以不去管这个userdata参数。
void SliderAlpha();
void on_Tracbar(int,void*);
#define MAX_ALPHA 100 void SliderAlpha() { int sliderAlpha; //滑动条当前值 //声明存储图片的变量 Mat image[2]; image[0] = imread("./image/girl.jpg"); image[1] = imread("./image/view5.jpg"); //创建窗体 namedWindow("Girl",WINDOW_NORMAL); //设置滑动条初始值 sliderAlpha = 50; //在窗体中添加滑动条,注意最后参数的传递,避免的全局变量 createTrackbar("透明度", "Girl", &sliderAlpha, MAX_ALPHA,on_Tracbar,&image); //第一次运行,先放置图片 addWeighted(image[0], 0.5, image[1], 0.5, 0, image[0]); imshow("Girl", image[0]); //结果在回调函数中显示 //按任意键退出 waitKey(0); }
//滑动条回调函数 void on_Tracbar(int sliderAlpha,void* dstImage) { //static_cast<>用于安全转换指针 Mat* tempImage = static_cast<Mat*> (dstImage); double alphaValue; double betaValue; //设alphaValue+betaValue=1.0 alphaValue = (double)sliderAlpha /MAX_ALPHA; betaValue = 1 - alphaValue; cout << "当前比例" << endl; cout << "alphaValue/betaValue: " << alphaValue << "/" << betaValue << endl; //根据alphaValue和betaValue,线性混合 Mat dst; addWeighted(tempImage[0],alphaValue,tempImage[1],betaValue,0, dst); imshow("Girl", dst); }
还有一种方法避免全局变量:
通过getTrackbarPos()函数获取指针位置
int getTrackbarPos(const string& trackbarname, const string& winname)
参数一:滑动条名字
参数二:窗体名字