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)

参数一:滑动条名字

参数二:窗体名字

猜你喜欢

转载自blog.csdn.net/jinmie0193/article/details/79969833