运行代码后会显示用户选择的图片,在图片上鼠标左键点击并拖动绘制矩形框,可绘制多个矩形框,关闭图片后就会在控制台返回每个框的左上角和右下角坐标。
#include <iostream>
#include <algorithm>
#include<string>
//#include <vector>
#include<opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui_c.h>
//#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int fyf_rects[30][4];
int fyf_rectInde = 0;
Point fyf_start, fyf_end;
bool fyf_drawing = false;
Mat fyf_src ;
void onMouse(int event, int x, int y, int flags, void* param)
{
if (event == CV_EVENT_LBUTTONDOWN)
{
fyf_start = Point(x, y);
fyf_drawing = true;
}
else if (event == CV_EVENT_MOUSEMOVE && fyf_drawing)
{
Mat src2;
fyf_src.copyTo(src2);
//Mat img = *(Mat*)param;
//img = Scalar::all(0);
Mat img = src2;
fyf_end = Point(x, y);
rectangle(img, fyf_start, fyf_end, Scalar(0, 255, 0));
for (int i = 0; i < fyf_rectInde; i++)
{
rectangle(img, Point(fyf_rects[i][0], fyf_rects[i][1]), Point(fyf_rects[i][2], fyf_rects[i][3]), Scalar(0, 255,0));
}
imshow("image", img);
}
else if (event == CV_EVENT_LBUTTONUP)
{
fyf_drawing = false;
fyf_end = Point(x, y);
fyf_rects[fyf_rectInde][0] = fyf_start.x;
fyf_rects[fyf_rectInde][1] = fyf_start.y;
fyf_rects[fyf_rectInde][2] = fyf_end.x;
fyf_rects[fyf_rectInde][3] = fyf_end.y;
fyf_rectInde++;
}
else if (event == CV_EVENT_RBUTTONUP)
{
if (fyf_rectInde > 0)
{
fyf_rectInde--;
}
}
}
int* Rectstoremove(string img_filename){
Mat img = imread(img_filename);
img.copyTo(fyf_src);
imshow("image", img);
setMouseCallback("image", onMouse, 0);
waitKey(0);
int* p = &fyf_rects[0][0];
return p;
}
int main()
{
int* k = Rectstoremove("./mydata/0.jpg");
while(true){
if (*k == 0 && *(k + 1) == 0 && *(k + 2) == 0 && *(k + 3) == 0) {
break;
}
else {
cout << *k << "\t";
cout << *(k + 1) << "\t";
cout << *(k + 2) << "\t";
cout << *(k + 3) << endl;
}
k += 4;
}
return 0;
}
图片中的两个绿色矩形框为所选区域
运行结果