不知道有没有达到共享内存的效果,还凑合吧 !
利用setMouseCallback的最三个参数,进行数据传输,与回传。
typedef struct MyData
{
cv::Mat image;
std::vector<cv::Rect> ROIRects;
}MYDATA;
void on_mouse(int event, int x, int y, int flags, void *lpParam) //5,用户数据可选参数
{
static Point pre_pt = Point(-1, -1);
static Point cur_pt = Point(-1, -1);
if (event == EVENT_LBUTTONDOWN) //左键按下
{
pre_pt = Point(x, y);
}
else if (event == EVENT_MOUSEMOVE && flags) //,flags为1
{
MYDATA *pmd = (MYDATA *)lpParam;
cv::Mat tmp;
pmd->image.copyTo(tmp);
cur_pt = Point(x, y);
rectangle(tmp, pre_pt, cur_pt, Scalar(0, 255, 0, 0), 1, 8, 0);
imshow("img", tmp); //画的时候显示框
}
else if (event == cv::EVENT_LBUTTONUP) //左键抬起
{
MYDATA *pmd = (MYDATA *)lpParam;
rectangle(pmd->image, pre_pt, cur_pt, Scalar(0, 255, 0, 0), 1, 8, 0);
imshow("img", pmd->image); //画完后显示框
int width = abs(pre_pt.x - cur_pt.x);
int height = abs(pre_pt.y - cur_pt.y);
config.push_back(Rect(pre_pt.x, pre_pt.y, width, height));
//cout << "haha0" << endl;
pmd->ROIRects.push_back(Rect(pre_pt.x, pre_pt.y, width, height));
//cout << pmd->ROIRects.size() << endl;
}
}
void getROIRectFromImage( cv::Mat& image, std::vector<cv::Rect>& ROIRects)
{
imshow("img", image);
MYDATA my;
my.image = image.clone();
//my.ROIRects.push_back(Rect(0, 0, 0, 0));
my.ROIRects.clear();
setMouseCallback("img", on_mouse, (void *)&my);
if (27 == waitKey(0))
{
ROIRects.swap(my.ROIRects); //清空结构体vector
cout << ROIRects.size() << endl;
}
}
int main()
{
cv::Mat org = imread("1.jpg");
std::vector<cv::Rect> ROIRects;
getROIRectFromImage(org, ROIRects);
system("pause");
return 0;
}
其实本来用一个全局变量就可以实现的 ,但是因为不好看,有需要的直接拿去就好了。