在Learning OpenCV
书中的一个程序中:
void onTrackbarSlide(int pos)
{
cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);
}
和,在另一个位置:
if(frames!=0)
{
cvCreateTrackbar("Position","Example3",&g_slider_position,frames,onTrackbarSlide);
}
我们从哪里检索onTrackSlide(int pos)
函数中pos
的值?cvCreateTrackbar()
传递给它的值是什么?
我不知道OpenCV -但它看起来像onTrackbarSlide
是某种事件处理程序,所以它是从你正在创建的trackbar UI传递pos值。
没有直接从cvCreateTrackbar()
传递的pos值-看起来它创建了您的trackbar UI,然后如果与用户交互将调用onTrackBarSlide
。
查看文档,你会看到函数签名是:
cvCreateTrackbar(const char* trackbarName, const char* windowName, int* value, int count, CvTrackbarCallback onChange)
注意最后一个参数的类型是CvTrackbarCallback
。显然,这不是一个内置类型,而是由OpenCV定义的类型。因此,我们回到文档中查找更多信息,有趣的是,出现了以下信息:
函数cvCreateTrackbar()创建具有指定名称和范围的trackbar(也称为滑块或范围控件),分配一个与trackbar位置同步的变量,并指定一个回调函数在trackbar位置更改时调用。
在这段话的正下方,你可以看到CvTrackbarCallback
应该如何声明:
CV_EXTERN_C_FUNCPTR( void (*CvTrackbarCallback)(int pos) );
总之,为了调用cvCreateTrackbar()
,你需要声明一个带有void some_fun(int pos)
签名的函数,以便能够在跟踪条的滑块更新时被OpenCV通知。参数int pos
通知滑块的新位置。