在opencv中经常遇到调节参数的问题,比如我们在用高斯滤波器进行图像滤波的时候,需要不断调整滤波器内核的大小,来达到一个适合的滤波效果。如果直接在程序源码中进行修改高斯内核的大小,然后进行编译、运行观察图像效果,这是十分不方便的,而且不够直观。为了解决这个问题opencv中提供了Tracebar,也就是滑动条,它依附于窗口而存在,可以实现参数的动态调整。
下面是创建Tracebar的函数原型:
int createTrackbar(const string& trackbarname, const string& winname, int* value, int count, TrackbarCallback onChange=0, void* userdata=0);
Parameters:
createTracbar函数创建了一个具有特定名称和范围的滑动条,指定一个和位置同步的变量,而且要指定回调函数onChange(第五个参数),在滑动条位置改变的时候来调用这个回调函数,并且,创建的滑动条显示在指定的winname(第二个参数)所代表的窗口上。
下面是使用滑动条的示例代码:
#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="Koala.jpg"; //trackbar的值 int poiTrackBar=0; //trackbar的最大值 int maxValue=35; Mat imge; imge=imread (imgName,CV_LOAD_IMAGE_COLOR); //读入图像 namedWindow(winName); //新建窗口 imshow (winName,imge); //创建trackbar,我们把img作为数据传进回调函数中 createTrackbar (trackBarName, winName, &poiTrackBar, maxValue, onChangeTrackBar , &imge); 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); } }
上面的代码中,createTrackbar()函数的最后一个参数userdata是指向我们想传给回调函数的数据的一个指针。有了这个指针,我们可以不用设置太多的全局变量。但是由于这个参数是void*类型,所以在回调函数中需要将这个指针强制类型转换为我们的实际数据类型指针,然后用*运算符取出数据。
另外,还有两个很有用的函数:
第一个函数:int getTrackbarPos(const string& trackbarname, const string& winname);
用于获取当前当前滑动条的位置,第一个参数表示滑动条的名字,第二个参数表示滑动条父窗口的名字。示例代码如下:
cout << getTrackbarPos(trackBarName, imgName) << endl;
第二个函数:void setTrackbarPos(const string& trackbarname, const string& winname, int pos);
用于设置当前当前滑动条的位置,第一个参数表示滑动条的名字,第二个参数表示滑动条父窗口的名字。示例代码如下:
setTrackbarPos(trackBarName, imgName, 50);
|