我是C ++和opencv的新手,我正在尝试使用点击鼠标的坐标,然后使用卡尔曼滤波器跟踪该对象。
问题是我无法访问鼠标在实时视频中点击对象的x和y坐标。
有很多代码显示如何操作,但它对我没有用。
这是我的代码:
void CallBackFunc(int event, int x, int y, int flags, void* leftCoordinate){
Point *p = (Point*) leftCoordinate;
if ( event == EVENT_LBUTTONDOWN )
{
cout << "Left button position (" << x << ", " << y << ")" << endl;
p->x = x;
p->y = y;
cout << "this is the pointer : " << *p << endl;
}
}
int main(int argc, const char** argv )
{
// Getting the video here
Point TestP;
setMouseCallback("Original", CallBackFunc, &TestP);
cout << "The coordinates : x = " << TestP.x << " y = " << TestP.y << endl;
}
问题是,TestP总是空的,我需要在我的主要使用x和y坐标。
我非常感谢任何帮助。感谢
答案 0 :(得分:0)
看起来您的主要功能将在您点击图像之前退出。 TestP
仅在调用回调时更改,即单击图像时。您可能无法像在示例中显示的那样在主函数中显示它,因为在更新坐标之前已到达函数的结尾。
答案 1 :(得分:0)
在您的代码中,您没有显示任何imshow
或waitKey
。 imshow
对于抓取鼠标事件至关重要,而刷新事件队列则需要waitKey
。
要在OpenCV中使用鼠标回调,通常更容易使用全局变量。我知道,这不是一般的好习惯,但在这种情况下工作得很好并且使事情变得更容易。请记住,OpenCV HighGui模块并不是要创建一个功能齐全的GUI,但基本上只是为了帮助调试。如果您需要完整的GUI,则应该依赖于GUI库,例如Qt。
看看这段代码。它将打印出单击的点坐标,并在视频流上显示最后点击的坐标:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
Mat frame;
Point pt(-1,-1);
bool newCoords = false;
void mouse_callback(int event, int x, int y, int flag, void *param)
{
if (event == EVENT_LBUTTONDOWN)
{
// Store point coordinates
pt.x = x;
pt.y = y;
newCoords = true;
}
}
int main(int, char**)
{
VideoCapture cap(0); // open the default camera
if (!cap.isOpened()) // check if we succeeded
return -1;
Mat edges;
namedWindow("img", 1);
// Set callback
setMouseCallback("img", mouse_callback);
for (;;)
{
cap >> frame; // get a new frame from camera
// Show last point clicked, if valid
if (pt.x != -1 && pt.y != -1)
{
circle(frame, pt, 3, Scalar(0, 0, 255));
if (newCoords)
{
std::cout << "Clicked coordinates: " << pt << std::endl;
newCoords = false;
}
}
imshow("img", frame);
// Exit if 'q' is pressed
if ((waitKey(1) & 0xFF) == 'q') break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}