opencv学习记录——(6)滚动条演示操作-调整图片亮度

本次主要介绍通过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的要求,此处的值需要设置否则在没有滑动滑块时,最初显示不出来图像;
}

你可能感兴趣的:(c++)