OpenCV 2.3 with VS 2008 -鼠标事件



必填项-我是新手。有一份涉及编程的工作,我会边做边自学。不用说,作为一名教师,我经常犯错误,而且犯得很彻底。

我现在在哪里:我已经创建了类"图形",它(令人惊讶的是)制作图形。但现在我想让它在鼠标点击时可以修改图形。但是我似乎不能让鼠标处理程序成为类的成员函数。

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

不兼容
cv::setMouseCallback(windowName, Graph::onMouse, 0);

它使我缺少参数错误。根据这个,我不能使它成为一个成员函数。在给出答案后,它编译,但我的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;
}

我不关心移动窗口,我想修改图形本身-这是作为cv::Mat变量存储在一个图形对象。我不知道该怎么做。

任何帮助都将是感激的,我真的希望这不是胡言乱语。

是的,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的最后一个参数对于克服您经常遇到的一些类似的问题非常有用。

你也可以使用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);

参数可以是NULL或任何你想传递给方法的参数,但是你需要将类型强制转换为你想要的类型。

希望这是有用的。再见。

相关内容

  • 没有找到相关文章

最新更新