#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#define PATH_PHOTO "F:/C++/OpenCv_QR/photo/test6.jpg"
using namespace cv;
using namespace std;
int main()
{
Mat src = imread(PATH_PHOTO);
if (src.empty()) {
printf("error");
return -1;
}
Mat gray;
cvtColor(src, gray, COLOR_RGB2GRAY);
Mat binary;
threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
vector<vector<Point>> contours;
vector<Vec4i> hireachy;
findContours(binary.clone(), contours, hireachy, RETR_TREE, CHAIN_APPROX_NONE, Point());
vector<vector<Point>> filter1;
vector<vector<Point>> filter2;
vector<vector<Point>> filter3;
int ic = 0;
int parentIdx = -1;
for (int i = 0; i < contours.size(); i++)
{
if (hireachy[i][2] != -1 && ic == 0)
{
parentIdx = i;
ic++;
}
else if (hireachy[i][2] != -1)
{
ic++;
}
else if (hireachy[i][2] == -1)
{
if (ic == 2) {
RotatedRect rect1=minAreaRect(contours[parentIdx]);
RotatedRect rect2 = minAreaRect(contours[parentIdx+1]);
RotatedRect rect3 = minAreaRect(contours[parentIdx+2]);
if (rect1.size.width / rect1.size.height > 0.85) {
if ((rect1.size.width - rect2.size.width)/2 + (rect2.size.width - rect3.size.width)/2 < rect3.size.width) {
//drawContours(src, contours, i, Scalar(0, 0, 255), -1); //将定位点最内存的矩形换个颜色
filter1.push_back(contours[parentIdx]);
filter2.push_back(contours[parentIdx + 1]);
filter3.push_back(contours[parentIdx + 2]);
}
}
}
parentIdx = -1;
ic = 0;
}
}
for (int i = 0; i < filter1.size(); i++) {
RotatedRect minRect = minAreaRect(Mat(filter1[i]));
Point2f rect_points[4];
minRect.points(rect_points);
for (int j = 0; j < 4; j++) {
line(src, rect_points[j], rect_points[(j + 1) % 4], Scalar(255, 0, 0), 2);
}
}
for (int i = 0; i < filter2.size(); i++) {
RotatedRect minRect = minAreaRect(Mat(filter2[i]));
Point2f rect_points[4];
minRect.points(rect_points);
for (int j = 0; j < 4; j++) {
line(src, rect_points[j], rect_points[(j + 1) % 4], Scalar(0, 255, 0), 2);
}
}
for (int i = 0; i < filter3.size(); i++) {
RotatedRect minRect = minAreaRect(Mat(filter3[i]));
Point2f rect_points[4];
minRect.points(rect_points);
for (int j = 0; j < 4; j++) {
line(src, rect_points[j], rect_points[(j + 1) % 4], Scalar(0, 0, 255), 2);
}
}
RotatedRect minRect1 = minAreaRect(Mat(filter1[0]));
RotatedRect minRect2 = minAreaRect(Mat(filter1[1]));
RotatedRect minRect3 = minAreaRect(Mat(filter1[2]));
int minLeft = min(min(minRect1.center.x, minRect2.center.x), minRect3.center.x);
int maxLeft = max(max(minRect1.center.x, minRect2.center.x), minRect3.center.x);
int minTop = min(min(minRect1.center.y, minRect2.center.y), minRect3.center.y);
int maxTop = max(max(minRect1.center.y, minRect2.center.y), minRect3.center.y);
int rectWidth =minRect1.size.width / 2;
Rect rect(minLeft-rectWidth,minTop-rectWidth,maxLeft-minLeft+minRect1.size.width, maxLeft - minLeft + minRect1.size.width);
Mat mat = src(rect);
namedWindow("input_image", WINDOW_AUTOSIZE);
imshow("input_image", mat);
imwrite("F:/test.png", mat);
waitKey();
return 0;
}