OpenCV从鼠标回调函数返回值

时间:2013-03-22 12:33:14

标签: opencv

在OpenCV中,我想将Point(x,y)之类的点位置返回到main()函数,我单击鼠标回调函数中的图像。除了设置全局变量之外还有吗?

我不想在on_mouse()函数中编写所有代码。

由于

3 个答案:

答案 0 :(得分:6)

在那里扩展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 

答案 1 :(得分:3)

您可以通过将指向数据的指针作为参数传递给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 
}

答案 2 :(得分:-2)

不,这是不可能的,因为on_mouse()是一个回调函数。 Here是它的opencv文档。

因此,“全局”变量是解决此问题的唯一方法。或者,如果您正在寻找更好的解决方案,您可以创建一个包装类,其中包含namedWindowMouseCallback以及一个私有成员变量,当调用鼠标回调函数时会对其进行操作