学习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); } }