createTrackbar 解释
函数说明:
createTrackbar()函数的函数原型为:
CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname,int* value, int count,TrackbarCallback onChange = 0, void* userdata = 0);
trackbarname:这个参数用来给这个滚动条取一个名字;
winname:这个参数用来指定你要吧这个滚动条用到那个窗口上;
value:这个参数用来设置滑块初始值位置,同时记录滑块以后的位置;
count:这个参数用来指定滚动条可以滚动的最大值;
onChange:这个参数可以理解为一个函数类型的变量(当然这样说感觉有点怪),用来接收回调函数函数名的,默认值为0;
userdata:这个变量这个参数是用户传给回调函数的数据,用来处理轨迹条事件,默认值为0。
value这个参数首先要知道它是用来给滑块位置一个初始值的,也就是滑块的初值,滑块可以滑动的范围永远都是[0, count],count即为第四个参数。
然后在说对onChange该参数的理解:
void (TrackbarCallback)(int pos, void userdata);
当我们没看回调函数原型时可能很难理解有些代码中定义回调函数时为什么必须要有那俩参数,userdata对应的就是createTrackbar 的第6个参数,而pos就是trackbar传递给系统的bar当前位置。
void on_trackTrigger(int pos, void* usrdata)
{
uchar loc;
Mat *image = static_cast<Mat*>(usrdata);
Mat dst = Mat::zeros(image->size(), image->type());
Mat m = Mat::zeros(image->size(), image->type());
if (pos < 50)
{
loc = 50 - pos;
m = Scalar(loc, loc, loc);
subtract(*image,m,dst);
}
else
{
loc = pos - 50;
m = Scalar(loc, loc, loc);
add(*image, m, dst);
}
imshow("LightChange", dst);
}
void QuickDemo::tracking_bar_Demo(Mat& image)
{
int maxValue = 100;
namedWindow("LightChange", WINDOW_FREERATIO);
createTrackbar("valueBar", "LightChange", &lightness, maxValue, on_trackTrigger, &image);
on_trackTrigger(50,&image);
waitKey(0);
}
有一点需要说明,on_trackTrigger这个函数不能是QuickDemo类中的私有函数。开始我的.h文件私有部分如下:
private:
Mat dst, m;
int lightness = 50;
void on_trackTrigger(int pos, void* usrdata);
一直报错 void的类型 无法与 TrackbarCallback类型做强转。
当把on_trackTrigger 取消私有后,一切正常。
posted on 2022-08-13 21:29 HumbleFish 阅读(90) 评论(0) 编辑 收藏 举报