学习OpenCV(六)TrackBar的使用


在以前的几个例子里面,我们并没有实现与计算机的交互。在OpenCV中,我们可以使用TrackBar来进行交互,调整一些参数的大小。这篇文章主要介绍了如何使用TrackBar。

举一个均值滤波blur的例子。我们已经知道,卷积核影响了均值滤波的效果。卷积核越大,图像的模糊化越严重。我们可以使用TrackBar动态地调整卷积核的大小,这样可以使得实验效果更加直观。

首先,来看一下参考手册中的描述。我们可以使用createTrackbar函数来创建一个TrackBar。这个函数的原型如下:


其中,参数的意义为:

	int createTrackbar (const string& trackbarName,const string& winName,
						int *value,int count,
						TrackbarCallback onChange=0,void *userdata=0);

trackbarName为创建的TrackBar的名字,

winName为创建的TrackBar所依附的窗体名字,

*value指针指向的是TrackBar当前的值,可以通过设置它改变游标的位置,

count为TrackBar的量程,注意一般情况下bar的最小值都是0,

TrackbarCallback为一个函数指针,这个函数必须有下面的原型:

void onChangeTrackbar(int ,void* );

其中第一个参数是trackerbar的值,第二个参数是一个无类型的指针,指向userdata(参数的意义见下面)这个函数作为回调函数,在TrackBar的值发生改变的时候被调用。如果这个参数被传进去一个空指针NULL,那么当TrackBar值发生改变的时候什么也不做。

userdata是指向我们想传给回调函数onChangeTrackbar的数据的一个指针。有了这个指针,我们可以不用设置太多的全局变量。在回调函数中,需要将这个指针强制类型转换为我们的实际数据类型指针,然后用*运算符取出数据。

下面就是例程:

#include <iostream>
#include <opencv/cv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

//定义了窗体名
string winName="Blur Filter";

//TrackBar发生改变的回调函数
void onChangeTrackBar(int poi,void* usrdata);

//主函数
int main ()
{
	//trackbar名
	string trackBarName="Size";
	//图像文件名
	string imgName="image.tif";
	//trackbar的值
	int poiTrackBar=0;
	//trackbar的最大值
	int maxValue=35;

	Mat img;
	img=imread (imgName,CV_LOAD_IMAGE_COLOR);   //读入图像
	namedWindow(winName);      //新建窗口
	imshow (winName,img); 
	//创建trackbar,我们把img作为数据传进回调函数中
	createTrackbar (trackBarName,winName,&poiTrackBar,maxValue,
					onChangeTrackBar ,&img);
					
	waitKey ();
	return 0;
}

//回调函数
void onChangeTrackBar (int poi,void* usrdata)
{
	Mat img=*(Mat*)(usrdata);   //强制类型转换
	Mat dst;
	if (poi%2==0)  //poi是偶数,把它减1变为奇数
	{
		poi-=1;
	}
	if (poi>0)   //poi是奇数
	{
		//改变矩阵核
		Size blurSize=Size(poi,poi);
		//刷新
		blur (img,dst,blurSize);
		imshow (winName,dst);
	} 
}



原文地址:https://www.cnblogs.com/xmfbit/p/3872185.html