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