示例代码:
Mat dsc, m,tim;
int begin, lightness;
static void intrack(int , void*)
{
m = Scalar(begin, begin, begin);
add(dsc, m, tim);
imshow("亮度调节", tim);
}
void demo::tracking_bar(Mat& image)
{
namedWindow("亮度调节", WINDOW_AUTOSIZE);
m = Mat::zeros(image.size(), image.type());
dsc = Mat::zeros(image.size(), image.type());
dsc = image;
lightness = 100;
begin = 50;
createTrackbar("value_track", "亮度调节",&begin,lightness,intrack);
}
createTrackbar(XXX)函数用来在指定窗口创建滚动条,可以很方便的调整阈值的大小。
createTrackbar声明在highgui.hpp文件。
CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
参数1 trackbarname:滑动条轨迹名,输入字符串
参数2 winname:滑动条依附的窗口名,使用滚动条之前要创建一个窗口
参数3 value:滑块的位置,创建时,滑块初始位置就是这个变量当前的值
参数4 count:轨迹的最大值
参数5 onChange:回调函数,默认为0
参数6 userdata:默认0,用户传给回调函数的数据,如果第三个值为全局变量,忽略这个值.
参数value:
value表示滚动条初始位置的值,而不一定是最小值,滚动条的取值范围是[0,count].
在六个参数里面,最重要的就是参数5
typedef void (*TrackbarCallback)(int pos, void* userdata);
参数1 pos:是跟踪栏位置
参数2 userdata:是用户数据,如果回调函数是NULL指针,则不会调用回调函数,而只会更新值(比如窗口中的图像数据地址)
(TrackbarCallback)为函数void (int pos,void userdata)的别名
两个参数都是由creatTrackbar()传递,value传递给pos,参数6传递给userdata。
下面的代码是增加第六个参数的写法:
static void intrack2(int b, void* image2)
{
Mat image = *((Mat*)image2);
m = Mat::zeros(image.size(), image.type());
//tim = Mat::zeros(image.size(), image.type());
m = Scalar(b, b, b);
Mat t;
add(image, m, t);
imshow("亮度调节2", t);
}
void demo::tracking_bar2(Mat& image)
{
namedWindow("亮度调节2", WINDOW_AUTOSIZE);
lightness = 100;
begin = 50;
createTrackbar("value_track", "亮度调节2", &begin, lightness, intrack2,(void*)(&image));
}
里面比较重要的是注意类型转换
Mat image=*((Mat*)image2);
因为在createTrackbar中转递的image类型是void*,要得到图像的数据需要转换成矩阵。
结果展示:
over!!!