OpenCV跟踪条回调的c++类

OpenCV trackbar callback in C++ class

本文关键字:c++ 回调 跟踪 OpenCV      更新时间:2023-10-16

我有一个关于如何在OpenCV中定义trackbar回调的问题,当在c++中使用类时。

当我定义我的trackbar,让我们说在我的。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…我想这是范围的问题。但我不确定如何解决这个问题?

如有任何帮助,不胜感激。

回调函数必须是静态的或全局的,但是你可以传递给它一个你想要操作的对象的引用(参见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.
}

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

必须将回调函数实现为全局函数或静态成员函数。为了使它看起来更面向对象,您可能更愿意将其实现为静态成员函数:)

我使用不同的解决方案来获取类变量中的滑块值(在我的情况下,获得实况视频流的选择旋转角度)。createTrackbar函数中的int* 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;
    }