2015-02-09 61 views
1

为了不混淆全局变量和函数,我想在OpenCV中使用类的函数作为轨迹条句柄的函数。下面的代码描述了一个思路:将C++类转换为另一个创建OpenCV轨迹条句柄

void cam::set_Trackbarhandler(int i, void *func) 
{ 
    /* This function might be called whenever a trackbar position is changed */ 
} 

void cam::create_Trackbars(void) 
{ 
    /** 
    * create trackbars and insert them into main window. 
    * 3 parameters are: 
    * the address of the variable that is changing when the trackbar is moved, 
    * the maximum value the trackbar can move, 
    * and the function that is called whenever the trackbar is moved 
    */ 

    const string trck_name = "Exposure"; 
    char wnd_name[128]; 
    get_Mainwindowname(wnd_name, sizeof(wnd_name)); 


    createTrackbar(trck_name, //Name of the trackbar 
        wnd_name, //Name of the parent window 
        &setting, //value that's changed 
        (int)out_max, //maximum value 
        this->set_Trackbarhandler); //pointer to the function that's called 
} 

我希望它概括。编译时我得到的错误读取

error: cannot convert 'cam::set_Trackbarhandler' from type 'void (cam::)(int, void*)' to type 'cv::TrackbarCallback {aka void (*)(int, void*)}'| 

有没有办法投void (cam::)(int, void*)成一个简单的void (*)(int, void*)或做我必须使用一个全球性的功能,那就是

void set_Trackbarhandler(int i, void *func) 

?如果非要那样做,我的最后一招是使用空指针(见http://docs.opencv.org/modules/highgui/doc/user_interface.html)和回送一个指针类,

createTrackbar(trck_name, 
        wnd_name, 
        &setting, 
        (int)out_max, 
        set_Trackbarhandler, //now a global function 
        this); 

我猜。在set_Trackbarhandler功能,我会做一个像

cam *ptr = static_cast<cam *>(func); 

虽然听起来有点复杂。

+1

您可以将指针不能转换为成员函数指针。如果您不想使用全局函数,请在名称空间中声明它。 – 2015-02-09 19:57:26

回答

3

好。你需要一些间接的,但它不是那么糟糕......

class cam 
{ 
public: 

    void myhandler(int value) 
    { 
     // real work here, can use 'this' 
    } 

    static void onTrack(int value, void* ptr) 
    { 
     cam* c = (cam*)(ptr); 
     c->myhandler(value); 
    } 
}; 

createTrackbar(trck_name, 
        wnd_name, 
        &setting, 
        (int)out_max, 
        cam::onTrack, //now a static member 
        this); 
+0

这很好。要强调第六个参数对createTrackbar()的重要性,它是静态回调如何获取实例的句柄。我没有通过这个,并花了我五分钟与gdb想知道为什么这不起作用。但唉:它的确如打字一样。 – Jameson 2016-03-11 13:15:17