二维码识别(自己瞎写的,有bug)

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值