在OpenCV中,我们常常需要调节卷积核的大小(邻域的大小)或者是亮度,对比度的调整。这时候如果我们通过手动修改是非常麻烦的。这时候使用OpenCV提供的createTrackbar函数就方便了许多。
createTrackbar函数创建一个滑动条,并且当你滑动的时候可以触发回调函数。这个机制其实类似与Windows下的消息回调机制或者是Qt提供的信号槽机制。当你滑动这个条的时候,回调函数才会被调用。其实就是一种软件中断技术。我们现在来看一下createTrackbar函数的原型。
int createTrackbar(const String& trackbarname, const String& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
参数1:滑动条轨迹名;
参数2:滑动条依附的窗口名;
参数3:滑块的位置,创建时,滑块初始位置就是这个变量当前的值;
参数4:轨迹的最大值;
参数5:回调函数;
参数6:默认0,用户传给回调函数的数据,如果第三个值为全局变量,忽略这个值.;如果使用第6个参数,则作为参数传给回调函数的usrdata。
我们来看一段具体的代码。
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
Mat src;
Mat dst;
//createTrackbar的回调函数
void myMedianBlur(int ksize, void* p);
int main()
{
int kmin = 0;
int kmax = 50;
src = imread("C:/Users/zhou_/Desktop/3.jpg");
if (!src.data)
{
perror("load failed:");
exit(0);
}
imshow("src", src);
namedWindow("中值滤波去除椒盐噪声");
//需要注意这里,没有这行运行之后不是马上显示中值滤波结果,而是需要拖到滑动条才行
//这也切实体现了createTrackbar函数去调用回调函数的机制
myMedianBlur(kmin,NULL);
createTrackbar("参数", "中值滤波去除椒盐噪声", &kmin, kmax, myMedianBlur);
waitKey(0);
return 0;
}
void myMedianBlur(int ksize, void* p)
{
medianBlur(src, dst, ksize * 2 + 1);
imshow("中值滤波去除椒盐噪声", dst);
}
运行结果如下: