1

我意识到有很多与我要问的问题相关的问题,但我仍然在让所有东西协同工作时遇到一些麻烦。我对 C++ 和 OpenCV 还很陌生,所以如果我的问题很明显,请原谅。

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

现在我遇到了 3 的问题。我试图在我的主函数中使用 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 的更新值。

我在另一个地方读到,这可以通过创建一个类来解决。我试着用这个这个建模

现在我正在尝试执行以下操作:我想要展示的是,每当鼠标事件发生时,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;
}

非常感谢!

4

2 回答 2

0

编辑:我确实误解了你。你不需要为此上课。

如果您想在每次发生鼠标事件时调用 OpenCV 函数,请从mouseHandler(). 如果您想按照自己的日程安排给他们打电话,请在main(). 由于您通过p引用(& 符号)传递,它将始终保存最新的鼠标信息。你的问题是你只打印p了一次。


我想要展示的是,只要发生鼠标事件,p 的值就会被更新。

cout除非我误会了你,否则把你搬进去还不够mouseHandler()吗?您也可以p进入ROIPoint并调用setMouseCallback()构造函数。那么你甚至不需要传入pas param

顺便说一句,OpenCV 有自己的问答论坛:http ://answers.opencv.org/

于 2013-07-18T16:51:26.780 回答
0

您的问题已经在这里得到解答,答案正是您所要求的。您不需要将回调函数包装到一个类中。

于 2013-07-18T18:03:53.137 回答