回调函数必须是静态或全局的,但您可以向其传递对要操作的对象的引用(请参阅这个帖子 http://opencv-users.1802565.n2.nabble.com/Member-function-callback-in-cvCreateTrackbar-td3785481.html在 OpenCV 用户邮件列表中)。
The 创建轨迹栏 http://opencv.willowgarage.com/documentation/cpp/user_interface.html#cv-createtrackbar方法有一个userdata
传递给调用函数的参数。在C中有一个未记录的cvCreateTrackbar2
方法,定义于highgui_c.h
,它具有相同的功能:
CVAPI(int) cvCreateTrackbar2( const char* trackbar_name, const char* window_name,
int* value, int count, CvTrackbarCallback2 on_change,
void* userdata CV_DEFAULT(0));
这些方法允许您创建一个带有静态回调函数的类,该函数采用指向该类的对象的指针。您可以像这样创建轨迹栏:
cv:createTrackbar("Label", "Window" &variable, MAX_VAL, &MyClass::func, this);
回调看起来像这样:
void MyClass:func(int newValue, void * object) {
MyClass* myClass = (MyClass*) object;
// ...do stuff.
}
请注意,您不需要自己显式更新变量,只要在创建轨迹栏时提供指向该变量的指针即可(如上所述),但如果您需要先处理它,我建议您在回调函数中显式设置它。