setMouseCallback将坐标传递给main函数

时间:2013-07-18 16:37:16

标签: c++ opencv

我意识到有很多问题与我要提出的问题有关,但我仍然遇到一些麻烦让所有事情一起工作。我是C ++和OpenCV的新手,所以如果我的问题很明显,请原谅。

基本上,我要做的是:    1.打开图像    2.让用户单击图像上的某个点    3.在用户单击的位置周围创建感兴趣的区域    4.在感兴趣的区域执行角点或特征检测

现在我遇到麻烦3.我试图在我的main函数中使用setMouseCallback来获取用户选择的像素的坐标。我尝试过使用以下形式的东西:

void mouseHandler( int e, int x, int y, int d, void *ptr){
    Point*p = (Point*)ptr;
    p->x = x;
    p->y = y;
}

int main() {
    Point p;
    namedWindow("window");
    Mat image = imread("cam3_10.tif");
    imshow("window",image);

    setMouseCallback("window",mouseHandler, &p ); 

    cout <<p;

    waitKey(0);
    return 0;
} 

但是,当我使用这种形式的指针时,我不确定下次按下鼠标按钮时如何获取p的更新值。

我在另一个地方读到,可以通过创建一个类来解决这个问题。我尝试了thisthis

的模型

现在我正在尝试执行以下操作: 我希望能够显示的是,只要发生鼠标事件,就会更新p的值。非常感谢任何帮助。

#include <opencv/cv.h>
#include<opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

Mat frame;
Point p;

class ROIPoint {
    Point ROI, guess;
public:
    static void mouseHandler(int event, int x, int y, int flags, void* param) {
        if(event == CV_EVENT_LBUTTONDOWN){
            Point*p = (Point*)param;
            p->x = x;
            p->y = y;
        }
    }
};

int main( int argc, char** argv )
{
   frame = imread("cam3_10.tif",1);
   char* name = "Frame";
   namedWindow( name, 0 );
   imshow("Frame",frame);
   ROIPoint obj;
   setMouseCallback(name, obj.mouseHandler,&p);

   cout << p <<endl;


   waitKey(0);
   return 0;
}

非常感谢你!

2 个答案:

答案 0 :(得分:0)

编辑:我确实误解了你。你不需要一个类。

如果您想在每次鼠标事件时调用OpenCV函数,请从mouseHandler()调用它们。如果您想按照自己的时间表拨打电话,请在main()中进行。由于您通过引用(&amp;符号)传递p,因此它将始终保存最新的鼠标信息。您的问题是您只打印了p一次。


  
    

我希望能够显示的是,只要发生鼠标事件,就会更新p的值。

  

除非我误解你,否则将cout移到mouseHandler()是不够的?您也可以将p移至ROIPoint并在构造函数中调用setMouseCallback()。那么您甚至不需要将p作为param传递。

顺便说一下,OpenCV有自己的Q&amp; A论坛:http://answers.opencv.org/

答案 1 :(得分:0)

您的问题已经answered here,答案完全符合您的要求。您不需要将回调函数包装到类中。