Rus*_*ear 8 c++ opencv mouseevent
义务 - 我是新手.有一份涉及编程的工作,我正在自学.不用说作为老师,我经常彻底地弄错了.
我现在在哪里:我已经创建了"Graph"类,它(令人惊讶的是)创建了图形.但现在我想这样做,以便在鼠标点击时我修改图形.但我似乎无法让鼠标处理程序成为该类的成员函数.
cv::setMouseCallback(windowName, onMouse, 0); // Set mouse handler to be onMouse
Run Code Online (Sandbox Code Playgroud)
不适用
cv::setMouseCallback(windowName, Graph::onMouse, 0);
Run Code Online (Sandbox Code Playgroud)
它让我缺乏参数错误.根据这个我不能使它成为一个成员函数.按照给出的答案后,它会编译,但我的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;
}
Run Code Online (Sandbox Code Playgroud)
我不关心移动窗口,我想修改图形本身 - 它在Graph对象中存储为cv :: Mat变量.我无法弄清楚如何做到这一点.
任何帮助将不胜感激,我真的希望这不仅仅是胡言乱语.
Chr*_*rle 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;
}
Run Code Online (Sandbox Code Playgroud)
setMouseCallback上的最后一个参数对于克服您经常遇到的一些问题非常有用.
| 归档时间: |
|
| 查看次数: |
4781 次 |
| 最近记录: |