3

在使用 C++ 中的类时,我有一个关于如何在 OpenCV 中为轨迹栏定义回调的问题。

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

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

这是我的头文件:

class SliderwithImage {

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

    void sliderCallBack(int pos);
};

这是实现文件:

#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) {

}

显然 createTrackbar 方法不能识别sliderCallBack ...我猜这是范围的问题。但我不确定如何解决这个问题?

任何帮助,将不胜感激。

非常感谢。

4

3 回答 3

6

回调函数必须是静态的或全局的,但您可以将引用传递给您想要操作的对象(请参阅OpenCV 用户邮件列表上的这篇文章)。

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.
}

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

于 2012-05-10T05:25:16.707 回答
3

您必须将回调函数实现为全局函数或静态成员函数。为了使它看起来更像 OOP,您可能更喜欢将其实现为静态成员函数:)

于 2011-12-26T15:05:08.537 回答
0

我正在使用不同的解决方案来获取类变量中的滑块值(在我的情况下,获取实时视频流的选定旋转角度)。createTrackbarint* value函数中的 是一个公共类变量,然后在循环中使用该变量(在获取视频时,但这可能会导致重复重绘单个图像的混乱工作)。

不是最好的解决方案,但它对我有用。

cv::createTrackbar("Rotation Angle(deg)", "Preview", &rotationAngle, 
alpha_slider_max, NULL);

    for(;;)
    {
        int rotAngle = this -> rotationAngle;
        cv::Mat frame;
        cv::Mat rot_frame;
        this -> capture >> frame;
        rot_frame = rotateVideo (frame, rotAngle);  
        imshow("Preview", rot_frame);
        if(cv::waitKey(30) >= 0) break;
    }
于 2013-01-17T15:52:48.517 回答