OpenCV 2.3与VS 2008 - 鼠标事件

时间:2011-07-21 19:28:54

标签: c++ opencv mouseevent

强制性 - 我是新手。有一份涉及编程的工作,我正在自学。不用说作为老师,我经常彻底地弄错了。

我现在在哪里:我创建了“Graph”类,它(令人惊讶的是)制作了图表。但现在我想这样做,以便在鼠标点击时我修改图形。但我似乎无法让鼠标处理程序成为该类的成员函数。

cv::setMouseCallback(windowName, onMouse, 0); // Set mouse handler to be onMouse

不适用于

cv::setMouseCallback(windowName, Graph::onMouse, 0);

它让我缺乏参数错误。根据{{​​3}}我不能使它成为一个成员函数。按照给出的答案后,它会编译,但我的this指针被清零。啊。

OnMouse看起来像这样:

void onMouse(int event, int x, int y,int, void*)
{
    if (event == CV_EVENT_LBUTTONDOWN)
    {
        cvMoveWindow("Window", 500, 500); //Just to see if stuff happened
    }
    return;
}

我不关心移动窗口,我想修改图形本身 - 它在Graph对象中存储为cv :: Mat变量。我无法弄明白该怎么做。

任何帮助都会受到赞赏,我真的希望这不仅仅是胡言乱语。

2 个答案:

答案 0 :(得分:11)

是的,C ++中的回调函数是一种乐趣,不是吗?你实际上必须给OpenCV一个函数(不是类方法),就像你已经发现的那样。但是,您可以使用以下技术破解这种可怕性:

class MyClass
{
public:
     void realOnMouse(int event, int x, int y, int flags)
     {
         // Do your real processing here, "this" works fine.
     }
};

// This is a function, not a class method
void wrappedOnMouse(int event, int x, int y, int flags, void* ptr)
{
    MyClass* mcPtr = (MyClass*)ptr;
    if(mcPtr != NULL)
        mcPtr->realOnMouse(event, x, y, flags);
}

int main(int argv, char** argc)
{
    // OpenCV setup stuff...

    MyClass processor;
    cv::setMouseCallback(windowName, wrappedOnMouse, (void*)&processor);

    // Main program logic

    return 0;
}

setMouseCallback上的最后一个参数对于克服你经常遇到的一些问题非常有用。

答案 1 :(得分:1)

您也可以将onMouse方法用作静态方法。

class Graph
{
public:
     static void onMouse(int event, int x, int y, void* param)
     {
          //Your code here
     }

     //Everything else you may need
}

现在你应该能够用:

调用onMouse方法
cv::setMouseCallback(windowName, onMouse, (void*) param);

param可以是NULL或您想要作为参数传递给方法的任何内容,但是您需要对所需类型进行类型转换。

希望这很有用。 再见。