我意识到有很多问题与我要提出的问题有关,但我仍然遇到一些麻烦让所有事情一起工作。我是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的更新值。
我在另一个地方读到,可以通过创建一个类来解决这个问题。我尝试了this和this
的模型现在我正在尝试执行以下操作: 我希望能够显示的是,只要发生鼠标事件,就会更新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;
}
非常感谢你!
答案 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,答案完全符合您的要求。您不需要将回调函数包装到类中。