OpenCV在for循环中从setMouseCallBack返回值

时间:2015-12-22 10:39:23

标签: c++ opencv

我正在使用setMouseCallBack函数来提取像素坐标。如果for循环更改为while(1),它可以工作。

现在,我想运行并记录像素坐标值仅24次。但是,for循环不起作用。我该怎么做才能使用setMouseCallBack函数?

谢谢!

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>

using namespace cv;

void mouse_call(int  event, int  x, int  y, int  flag, void *param)
{
    if (event == EVENT_LBUTTONDOWN)
    {
        Point *p = (Point*)param;
        p->x = x;
        p->y = y;
    }
    if (event == EVENT_LBUTTONUP)
    {
        Point *p = (Point*)param;
        p->x = x;
        p->y = y;
    }
}
int main(int argc, char** argv)
{
    static Point p;
    int cor[24][2] = {0};
    string filename;
    cout << "Filename: ";
    cin >> filename;
    img = imread(filename);
    resize(img, img, Size(), 0.5, 0.5, 1);
    namedWindow("Image"); 
    imshow("Image", img); 

    for(int i = 0; i < 24; i++)
    {
        setMouseCallback("Image", mouse_call);
        cor[i][0] = p.x
        cor[i][1] = p.y
    }

    waitKey(0);
    return(0);
}

2 个答案:

答案 0 :(得分:1)

尽管你的问题有点不明确,但我认为你的实际问题非常简单。

你的for循环 工作,但你必须记住,还有更多的鼠标事件。

你的 mouse_call 处理程序也会被处理程序忽略的移动事件发送垃圾邮件。由于循环只运行了24次,因此在完成之前没有实际机会捕获按钮事件。

答案 1 :(得分:1)

您只需设置一次回调。你需要告诉你传递的变量为param

我修改了一些你的代码以保持简单:

  • 坐标存储在vector<Point>
  • 坐标向量是一个全局变量。这使得像这样的玩具程序更容易。对于实际应用,它可能是一个类成员。
  • 我传递一个状态标志作为回调的参数,当我达到所需的点数时它变为真
  • 我添加了一个等待收集给定点数的循环
  • 我只在鼠标按下事件时收集一个点。

这里是代码:

#include <opencv2\opencv.hpp>
#include <vector>
#include <iostream>
using namespace cv;
using namespace std;

vector<Point> coords;
int N = 3;

void mouse_call(int  event, int  x, int  y, int  flag, void *param)
{
    if (event == EVENT_LBUTTONDOWN)
    {
        coords.push_back(Point(x,y));

        // Debug
        copy(coords.begin(), coords.end(), ostream_iterator<Point>(cout, " "));
        cout << endl;

        if (coords.size() == N)
        {
            bool* exitflag = static_cast<bool*>(param);
            *exitflag = true;
        }
    }
}

int main()
{
    bool bExit = false;

    string filename;
    cout << "Filename: ";
    cin >> filename;
    Mat3b img = imread(filename);
    resize(img, img, Size(), 0.5, 0.5, 1);

    namedWindow("Image");

    // Set callback
    setMouseCallback("Image", mouse_call, static_cast<void*>(&bExit));

    imshow("Image", img);

    while (!bExit)
    {
        waitKey(30);
    }

    cout << "Found " << N << " points... Exit" << endl;

    return(0);
}