OpenCV trackbar callback in C++ class

瘦欲@ 提交于 2019-12-21 05:35:41

问题


I have a question about how to define the callback for trackbars in OpenCV when working with classes in C++.

When I define my trackbar let's say in the constructor method of my .cpp class how can I define the callback?

I have been trying to work with function pointers but it doesn't work out. I guess I must be doing something very wrong :-)

This is my header file:

class SliderwithImage {

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

    void sliderCallBack(int pos);
};

This is the implementation file:

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

}

Obviously the createTrackbar method does not recognize sliderCallBack... I guess it's a problem of scope. But I am not sure how to solve this?

Any help would be appreciated.

Thank you very much.


回答1:


You have to implement the callback function either as a global function or a static member function. To make it more OOP look, you might prefer to implement it as a static member function:)




回答2:


The callback function must be static or global, but you can pass it a reference to an object you want to operate on (see this post on the OpenCV Users mailing list).

The createTrackbar method has a userdata parameter which is passed to the calling function. In C there is an undocumented cvCreateTrackbar2 method, defined in highgui_c.h, which has the same functionality:

CVAPI(int) cvCreateTrackbar2( const char* trackbar_name, const char* window_name,
    int* value, int count, CvTrackbarCallback2 on_change,
    void* userdata CV_DEFAULT(0));

These methods let you create a class with a static callback function that takes a pointer to an object of that class. You can create the trackbar like so:

cv:createTrackbar("Label", "Window" &variable, MAX_VAL, &MyClass::func, this);

The callback would look something like this:

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

Note that you don't need to explicitly update the variable yourself as long as you provided a pointer to it when creating the trackbar (as above), but if you need to process it first I suggest you set it explicitly in the callback function.




回答3:


I am using a different solution to obtain the slider value in a class variable (in my case to obtain chosen rotation angle of a live video stream). The int* value in the createTrackbar function is a public class variable which is then used within a loop (while the video is acquired, but this might messily work repeatedly redrawing a single image).

Not the best solution but it works for me.

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


来源:https://stackoverflow.com/questions/8636689/opencv-trackbar-callback-in-c-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!