opencv 之 createTrackbar的使用
主要讲解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)
参数一:滑动条名字
参数二:窗体名字
更多推荐


所有评论(0)