在OpenCV中,我希望将Point(x,y)的点位置返回到单击鼠标回调函数中的图像的main()函数。除了设置一个全局变量还有吗?OpenCV来自鼠标回调函数的返回值
我不想写on_mouse()函数中的所有代码。
感谢
在OpenCV中,我希望将Point(x,y)的点位置返回到单击鼠标回调函数中的图像的main()函数。除了设置一个全局变量还有吗?OpenCV来自鼠标回调函数的返回值
我不想写on_mouse()函数中的所有代码。
感谢
您可以通过指针传递到您的数据作为参数,以避免使用全局变量setMouseCallback()
。同意@berek,只是想在下面展示一个完整的例子,以避免混淆全局变量。
using namespace cv;
void on_mouse(int e, int x, int y, int d, void *ptr)
{
Point*p = (Point*)ptr;
p->x = x;
p->y = y;
}
in main() {
Point p;
namedWindow("window");
Mat image = imread("someimage.jpg");
imshow(image);
//pass a pointer to `p` as parameter
setMouseCallback("window",on_mouse, &p);
// p will update with new mouse-click image coordinates
// whenever user clicks on the image window
}
没有,这是不可能的,因为on_mouse()
是一个回调函数。 Here是它的opencv文档。
所以,“全局”变量是解决这个问题的唯一方法。或者,如果您正在寻找更好的解决方案,则可以创建一个包装类,其中包含namedWindow
和MouseCallback
以及一个私有成员变量,该变量在调用鼠标回调函数时被操作。
从类或如扩大Safirs想法还有余,你可以只通过在点本身:
void on_mouse(int e, int x, int y, int d, void *ptr)
{
Point*p = (Point*)ptr;
p->x = x;
p->y = y;
}
Point p;
namedWindow("win");
setMouseCallback("win",on_mouse, (void*)(&p));
// changed value of p will be accessible here
我讨厌在这里提高死亡率,但你能告诉我第四个参数(int d)是什么吗?我似乎无法找到鼠标回调参数的很好解释。 – 2014-07-15 15:18:39
鼠标状态(例如,当您按下鼠标时移动鼠标) – berak 2014-07-15 15:49:47
谢谢。那么唯一的办法是设置一个全局变量?为什么OpenCV有这个设置? – Aaron0769 2013-03-22 12:51:38
是的。或者我建议的包装类。 opencv主要用于图像处理,它没有触及GUI。它仅支持简单的用户界面:[用于用户界面的opencv文档](http://docs.opencv.org/modules/highgui/doc/user_interface.html)。 – Safir 2013-03-22 12:52:31
我明白了。但包装类只是一个点的位置......无论如何感谢 – Aaron0769 2013-03-22 12:57:12