我意识到有很多与我要问的问题相关的问题,但我仍然在让所有东西协同工作时遇到一些麻烦。我对 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;
}
非常感谢!