OpenCV 2.3 与 VS 2008 - 鼠标事件

2024-05-13

强制性-我是新手。有一份涉及编程的工作,并且我一边工作一边自学。不用说,作为一名老师,我经常犯彻底的错误。

我现在所处的位置:我创建了“Graph”类,它(令人惊讶的是)制作了图表。但现在我想通过单击鼠标来修改图形。但我似乎无法让鼠标处理程序成为该类的成员函数。

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

不适用于

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

它给了我缺少参数错误。根据this https://stackoverflow.com/questions/6489457/cvsetmousecallback-in-opencv-2-1-managed-c-cli-c我无法将其设为成员函数。按照给出的答案后,它编译了,但我的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 变量存储在 Graph 对象中。我不知道该怎么做。

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


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV 2.3 与 VS 2008 - 鼠标事件 的相关文章

随机推荐