c++ - 在 C++ 中赋予回调函数访问类数据成员的权限

标签 c++ opencv callback

我在我的项目中使用 C++ 中的 opencv 库,但在使用 MouseCallback 时遇到问题。

我有一个类 BoardCalibration,它有两个数据成员,我需要在回调函数中使用它们。你可以在下面看到这个类:

class BoardCalibration{
private:
    Rect _box;  <-- data members i need to upadte inside the callback function
    bool _drawingBox; <--

public:
    BoardCalibration();
    static void my_mouse_callback(int event, int x, int y, int flags, void* param);
    Rect calibrate(Mat& image);
    void drawBox(IplImage* img);
};

在 calibrate() 方法中,我正在调用接收回调 my_mouse_callback 函数的函数。代码:

Rect BoardCalibration::calibrate(Mat& image){
    IplImage * img = new IplImage(image);

    namedWindow("Calibration");

    IplImage *temp = cvCloneImage(img);
    cvSetMouseCallback("Calibration", my_mouse_callback, (void *)img);

    while (1){

        imshow("Calibration", Mat(img));
        cvCopyImage(img,temp);

        if( _drawingBox ){
            drawBox(temp);
        }

        imshow("Calibration", Mat(temp));

        if (waitKey(1)>=0)
            break;
    }

    cout << "calibrated\n";

    delete img;
    return _box;
}

my_mouse_callback 的实现是:

static void my_mouse_callback(int event, int x, int y, int flags, void* param){

    IplImage* image = (IplImage*) param;

    switch( event ) {
    case CV_EVENT_MOUSEMOVE: {
        if( _drawingBox ) {
            _box.width  = x-_box.x;
            _box.height = y-_box.y;
        }
                             }
                             break;
    case CV_EVENT_LBUTTONDOWN: {
        _drawingBox = true;
        _box = Rect( x, y, 0, 0 );
                               }
                               break;   
    case CV_EVENT_LBUTTONUP: {
        _drawingBox = false; 
        if( _box.width<0 ) { 
            _box.x+=_box.width;  
            _box.width *=-1; 
        }
        if( _box.height<0 ) { 
            _box.y+=_box.height; 
            _box.height*=-1; 
        }

        //drawBox(image, box);  // keep draw on screen
        // display rectangle coordinates
        cout << "TopLeft: (" << _box.x << "," << _box.y << "), BottomRight: (" 
            << _box.x+_box.width << "," << _box.y+_box.height << ")" << endl;
                             }
                             break;
    }
}

如您所见,我正在尝试联系 _box 和 _drawingBox 成员,但因为它是静态方法,所以无法识别它们。 我怎么解决这个问题??我无法更改 my_mouse_callback 的原型(prototype),否则它不会被 cvSetMouseCallback 接受。 我也不能在类之外定义那些数据成员,因为它给我错误,他们已经定义了。 还有什么我可以尝试的吗??? 谢谢。

最佳答案

我对 opencv 一无所知,但像这样的东西怎么样

struct Helper
{
    IplImage * pI;
    BoardCalibration * pObj;
};


Rect BoardCalibration::calibrate(Mat& image)
{
    .... stuff ....

    Helper * p = new Helper;
    p->pI = img;
    p->pObj = this;

    cvSetMouseCallback("Calibration", my_mouse_callback, (void *)p);

    .... stuff ...   


    delete p;
    delete img;
    return _box;

}


static void BoardCalibration::my_mouse_callback(int event, int x, int y, int flags, void* param)
{
    Helper * p = (Helper *)param;
    IplImage* image = p->pI;
    BoardCalibration * pBC = p->pObj;

    switch( event ) 
    {
        case CV_EVENT_MOUSEMOVE: 
        {
            if( pBC->_drawingBox )  // use the pBC pointer

            ... stuff ...


    }

    ... stuff ...

}

我不知道您的代码流程如何确定何时应该删除辅助对象。所以我在 delete img 附近有 delete Helper object 代码,因为如果该代码是正确的,那么这可能是 delete 的正确位置Helper 对象也是。但是你需要检查一下。仅当您确定届时该调用的回调已完成运行时,您才需要删除此对象。

关于c++ - 在 C++ 中赋予回调函数访问类数据成员的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14062501/

相关文章:

c++ - 切换键/c++

c++ - 如何在 opencv C++ 中访问特定的超像素

c++ - Boost函数指针多线程之谜

node.js - fs.writeFile 回调永远不会被调用,与 WritableStream.write 等相同

c++ - C++11 中对数组的右值引用的目的是什么?

c++ - 如何将 std::chrono 包装在 C++ 迭代器类型中

c++ - 通过链接到自身的深度优先搜索节点进行注入(inject)。 C++

opencv - 以随机比例和平移识别相似的形状

python - 如果输入宽度和高度与调整输入和宽度的大小相同, cv2.resize() 会做什么?

android - Facebook 对话教程 - 是否缺少某些内容?