C++类中的OpenCV trackbar回调

Wim*_*den 3 c++ opencv callback trackbar

我有一个问题,关于如何在使用C++中的类时在OpenCV中定义跟踪栏的回调.

当我定义我的跟踪栏时,让我们说我的.cpp类的构造函数方法如何定义回调?

我一直在尝试使用函数指针,但它没有用.我想我一定是做错了什么:-)

这是我的头文件:

class SliderwithImage {

public:
    SliderwithImage(void);
    ~SliderwithImage(void); 

    void sliderCallBack(int pos);
};
Run Code Online (Sandbox Code Playgroud)

这是实现文件:

#include "SliderwithImage.h"

void SliderwithImage::sliderCallBack(int pos) {


}

SliderwithImage::SliderwithImage(void)  {

    const char* windowName = "window";
    int lowvalue  =1;

    namedWindow(windowName,  CV_GUI_EXPANDED);

    createTrackbar("mytrackbar", windowName, &lowvalue, 255, sliderCallBack);

}

SliderwithImage::~SliderwithImage(void) {

}
Run Code Online (Sandbox Code Playgroud)

显然createTrackbar方法无法识别sliderCallBack ......我猜这是范围问题.但我不知道如何解决这个问题?

任何帮助,将不胜感激.

非常感谢你.

Dan*_*iel 6

回调函数必须是静态的或全局的,但您可以向它传递对您要操作的对象的引用(请参阅OpenCV Users邮件列表中的这篇文章).

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));
Run Code Online (Sandbox Code Playgroud)

这些方法允许您使用静态回调函数创建一个类,该函数接受指向该类对象的指针.您可以像这样创建轨道栏:

cv:createTrackbar("Label", "Window" &variable, MAX_VAL, &MyClass::func, this);
Run Code Online (Sandbox Code Playgroud)

回调看起来像这样:

void MyClass:func(int newValue, void * object) {
    MyClass* myClass = (MyClass*) object;
    // ...do stuff.
}
Run Code Online (Sandbox Code Playgroud)

请注意,只要在创建轨迹栏时提供了指向它的指针,您就不需要自己显式更新变量(如上所述),但如果您需要先处理它,我建议您在回调函数中明确设置它.