gpt4 book ai didi

c++ - OpenCV 从 for 循环中的 setMouseCallBack 返回值

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:15 25 4
gpt4 key购买 nike

我正在使用 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);
}

最佳答案

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

为了简单起见,我对您的代码做了一些修改:

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

这里是代码:

#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);
}

关于c++ - OpenCV 从 for 循环中的 setMouseCallBack 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34413864/

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