gpt4 book ai didi

c++ - setMouseCallback 将坐标传递给主函数

转载 作者:太空宇宙 更新时间:2023-11-04 14:04:13 25 4
gpt4 key购买 nike

我意识到有很多问题与我要问的问题有关,但我仍然无法让所有内容协同工作。我是 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 的更新值。

我在另一个地方读到,这可以通过创建一个类来解决。我试着用 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;
}

非常感谢!

最佳答案

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

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


All I want to be able to show is that the value for p is being updated whenever a mouse event occurs.

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

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

关于c++ - setMouseCallback 将坐标传递给主函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17729257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com