必填 - 我是新手。有一份涉及编程的工作,我边走边自学。毋庸置疑,作为一名教师,我经常彻底地犯错。
我现在所处的位置:我已经创建了“Graph”类,它(足够令人惊讶)制作图表。但现在我想通过单击鼠标来修改图形。但我似乎无法让鼠标处理程序成为该类的成员函数。
cv::setMouseCallback(windowName, onMouse, 0); // Set mouse handler to be onMouse
不适用于
cv::setMouseCallback(windowName, Graph::onMouse, 0);
它给我缺少参数错误。根据this我不能让它成为一个成员函数。按照给出的答案进行编译,但我的 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 的最后一个参数对于克服您经常遇到的一些问题非常有用。
关于c++ - 带有 VS 2008 的 OpenCV 2.3 - 鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6781622/