OpenCV:回调函数

 我们创建了一个trackbar,如下:

createTrackbar(trackBarName, winName, &posTrackBar, maxValue, onChangeTrackBar);

现在来看一下头文件中对每个参数的解释:

@param trackbarname Name of the created trackbar.
@param winname Name of the window that will be used as a parent of the created trackbar.
@param value Optional pointer to an integer variable whose value reflects the position of the
slider. Upon creation, the slider position is defined by this variable.
@param count Maximal position of the slider. The minimal position is always 0.
@param onChange Pointer to the function to be called every time the slider changes position. This
function should be prototyped as void Foo(int,void\*); , where the first parameter is the trackbar
position and the second parameter is the user data (see the next parameter). If the callback is
the NULL pointer, no callbacks are called, but only value is updated.
@param userdata User data that is passed as is to the callback. It can be used to handle trackbar
events without using global variables.
 */
CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname,
                              int* value, int count,
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);

第一个参数trackbarname对应如下左图,第二个参数winname对应下图右

 

 第三个参数value对应下图左的初始值,第四个参数count对应下图右中可以达到的最大值

 

 来看第五个参数TrackbarCallback onChange = 0;这里定义了一个TrackbarCallback类型的形参onChange,TrackbarCallback是什么类型呢?下面是源代码头文件中的解释

/** @brief Callback function for Trackbar see cv::createTrackbar
@param pos current position of the specified trackbar.
@param userdata The optional parameter.
 */
typedef void (*TrackbarCallback)(int pos, void* userdata);

typedef的功能是定义新的类型。这句就是定义了一种TrackbarCallback的类型,并定义这种类型为指向函数的指针,这种函数以(int pos, void* userdata)为参数并返回void类型。后面就可以像使用int,char一样使用TrackbarCallback了。

 好,现在就知道了,形参onChange是一个函数指针,那我们在最开始createTrackbar中传入的参数onChangeTrackBar就应该是一个地址,一个函数地址(函数名就是函数地址)

void onChangeTrackBar(int pos, void* usrdata)
{
	Mat src = img;
	Mat dst;
	// 二值化  
	threshold(src, dst, pos, 255, 0);
	imshow(winName, dst);
}
//注意:这里,第二个形参usrdata其实没有用到
//第一个参数在最开始的createTrackbar中虽然没有实参,但默认实参是第三个参数posTrackBar

如果我们在创建createTrackbar的时候用了第六个参数,那么第六个参数自动对应为onChangeTrackBar的第二个形参usrdata

createTrackbar(trackBarName, winName, &posTrackBar, maxValue, onChangeTrackBar,&img);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值