使用opencv / C ++实时保存和使用点击鼠标的坐标

时间:2016-02-17 14:44:22

标签: c++ opencv

我是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坐标。

我非常感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:0)

看起来您的主要功能将在您点击图像之前退出。 TestP仅在调用回调时更改,即单击图像时。您可能无法像在示例中显示的那样在主函数中显示它,因为在更新坐标之前已到达函数的结尾。

答案 1 :(得分:0)

在您的代码中,您没有显示任何imshowwaitKeyimshow对于抓取鼠标事件至关重要,而刷新事件队列则需要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;
}