本次主要介绍通过createTrackbar来设置一个进度条,实现图片的亮度调节。
补充知识:
对createTrackbar函数的总结:
原型:int createTrackbar(const string& trackbarname, const string&winname, int* value, int count ,TrackbarCallback onChange = 0, void* userdata = 0);
实际代码中是写成:
int createTrackbar(const string& trackbarname, const string&winname, int* value, int count ,on_track);
其中,on_track函数中包括:onchange和userdata两个变量;
如上:不同颜色代表不同的六个参数
其中:参数一 (trackbarname ):代表 轨迹条名字
参数二 (winname):代表 窗口的名字
参数三 (value) :代表 滑块初始位置(value也是实时表示滑块变化的值,例如滑块滑动到15,则value变化为15)
参数四 (count):代表滑块达到最大位置的值
参数五(onChange):默认值为0,指向回调函数
参数六(userdata):默认值为0,为用户传给回调函数的值,用来处理轨迹函数,如果第三个参数value使用的是全局变量的话,这值忽略
对参数五和六的解释:
参数五:默认值为0,指向回调函数的指针。每次滑块位置改变时,这个函数都会进行回调。且这个函数的原型必须为void on_track(int, void*);,其中第一个参数是轨迹条的位置,第二个参数是用户数据。如果回调函数是NULL指针,则表示没回调函数的调用,仅第三个参数value变化。
on_track 函数:首先对on_track函数进行解释,其原型为:typedef void (CV_CDECL *TrackbarCallback)(int pos, void* userdata); 里面有两个参数:
第一个是:int pos,他代表的是:createTrackbar函数中的第三个参数value,每当滑块移动,on_track函数被调用,value会被传入on_track函数的
pos中,从而使图片亮度发生改变。
第二个参数:userdata,目前只知道当value是实参且在全局函数中,userdata不会起到作用;
总结来看:(1)on_track函数其实就是一个指针的作用,指向回调函数on_track,滑块移动后value会变化,进而通过on_track指针传入回调函数on_track,从而使图片亮度发生变化;
(2)on_track(40, 0);里面的参数没有实际作用,可以随意给,因为on_track函数中并没有用到这两个参数只是为了符合createTrackbar参数调用的格式。
代码展示:
Mat src, dst, m;
int value= 50;//定义初始的亮度为50,即滑块的初始位置在50处
static void on_track(int ,void*)
{
m = Scalar(value,value,value);//创建调整亮度的数值
subtract(src, m, dst);//定义亮度变化为减
imshow("亮度调整", dst);//显示调整亮度之后的图片
}
void QuickDemo::tracking_bar_demo(Mat &image)
{
namedWindow("亮度调整",WINDOW_AUTOSIZE);
dst = Mat::zeros(image.size(), image.type());//图片的初始化创建一个和image大小相等,种类相同的图像
m = Mat::zeros(image.size(), image.type());//图片的初始化创建一个和image大小相等,种类相同的图像
src = image;
/*给src赋值 ,因为要在另一个函数中调用,所以必须重新把image赋值给src,因为要在两个调用函数中用同一个src,所以需要在全局变量中进行定义src;*/
int max_value = 100;//定义最大值为100
createTrackbar("Value Bar:", "亮度调整", &value, max_value,on_track);//调用函数实现功能。
on_track(50, 0);//没有实际意义,随意设置出两个值来满足createTrackbar的要求,此处的值需要设置否则在没有滑动滑块时,最初显示不出来图像;
}