C++ 带VS 2008的OpenCV 2.3-鼠标事件

C++ 带VS 2008的OpenCV 2.3-鼠标事件,c++,opencv,mouseevent,C++,Opencv,Mouseevent,强制性-我是个新手。有一份涉及编程的工作,我边走边自学。不用说,作为一名教师,我经常彻底地犯错误 我现在所处的位置:我创建了“Graph”类,它(足够令人惊讶)生成图形。但现在我想让它,在鼠标点击我修改图形。但我似乎无法使鼠标处理程序成为该类的成员函数 cv::setMouseCallback(windowName, onMouse, 0); // Set mouse handler to be onMouse 不适用于 cv::setMouseCallback(windowName, Gra

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

我现在所处的位置:我创建了“Graph”类,它(足够令人惊讶)生成图形。但现在我想让它,在鼠标点击我修改图形。但我似乎无法使鼠标处理程序成为该类的成员函数

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

cv::setMouseCallback(windowName, Graph::onMouse, 0);
它使我缺少参数错误。据我所知,我不能使它成为一个成员函数。遵循给定的答案后,它将编译,但我的
指针为空。啊

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变量存储在图形对象中。我不知道怎么做


<> P>任何帮助都是值得赞赏的,我真的希望这不仅仅是胡言乱语。

< P> 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);
param可以是NULL,也可以是任何您想作为参数传递给方法的参数,但是您需要将类型转换为所需的类型

希望这是有用的。
再见。

太棒了!非常感谢。由于我从图形成员函数调用setMouseCallback,我将&processor改为“this”,效果很好。是否可以将mouseCallback和调用者(我指的是setMouseCallback)分开,作为类的一部分而不是主程序中的一部分??我认为让这个类自己有鼠标功能更方便。可能的谢谢问得好!我也有同样的问题