Asignación principal del curso de visión por computadora: detección de código unidimensional

Detección de código unidimensional

Explicación

La detección de código unidimensional (no reconocimiento) se realiza mediante un método de procesamiento de imagen digital simple, que se utiliza para estudiar una tarea de curso de visión por computadora a gran escala
Evaluación: La capacidad antiinterferencia es demasiado pobre

Código

int main()
{
	Mat dividedLinearStrength(Mat src);
	//1、读图
	Mat src = imread("E:/opencv project/homework/week1/data/20.png");
	//2、将彩图转化为灰度图
	Mat src_gray;
	cvtColor(src, src_gray, CV_RGB2GRAY);
	//中值滤波
	Mat src_zhongzhi;
	medianBlur(src_gray, src_zhongzhi, 5);
	//3、高斯滤波
	Mat src_gaosi;
	GaussianBlur(src_zhongzhi, src_gaosi, Size(5, 5), 0);
	//线性拉伸:增强二维码对比度,忽略背景对比度明显区域
	Mat src_lashen;
	src_lashen = dividedLinearStrength(src_gaosi);
	//4、形态学梯度运算(scharr)
	Mat src_X, src_Y, src_scharr;
	Scharr(src_lashen, src_X, CV_32F, 1, 0);
	Scharr(src_lashen, src_Y, CV_32F, 0, 1);
	subtract(src_X, src_Y, src_scharr);
	//转为8位
	convertScaleAbs(src_scharr, src_scharr);
	//5、模糊化(均值滤波)
	Mat src_mean;
	blur(src_scharr, src_mean, Size(3, 3));
	//6、二值化处理
	Mat src_erzhi;
	threshold(src_mean, src_erzhi, 180, 255, CV_THRESH_BINARY);
	//腐蚀
	erode(src_erzhi, src_erzhi, getStructuringElement(MORPH_RECT, 		Size(5, 5)), Point(-1, -1), 2);
	//7、闭运算填充间隙	
	Mat src_bi;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11));
	morphologyEx(src_erzhi, src_bi, MORPH_CLOSE, kernel);
	//8、腐蚀膨胀(相同次数)
	erode(src_bi, src_bi, getStructuringElement(MORPH_RECT, Size(5, 5)), Point(-1, -1), 4);
	dilate(src_bi, src_bi, getStructuringElement(MORPH_RECT, Size(5, 5)), Point(-1, -1), 4);
	//9、找边界
	vector<vector<Point2i>>contours;
	vector<float>contourArea;
	//接下来对目标轮廓进行查找
	findContours(src_bi, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
	//计算轮廓的面积并且存放
	for (int i = 0; i < contours.size(); i++)
	{
		contourArea.push_back(cv::contourArea(contours[i]));
	}
	double maxValue;
	Point maxLoc;
	minMaxLoc(contourArea, NULL, &maxValue, NULL, &maxLoc);
	//计算面积最大的轮廓的最小的外包矩形
	RotatedRect minRect = minAreaRect(contours[maxLoc.x]);
	Point2f* vertices = new Point2f[4];
	minRect.points(vertices);
	for (int j = 0; j < 4; j++)
	{
		line(src, vertices[j], vertices[(j + 1) % 4], Scalar(0, 255, 255), 3, LINE_AA);
	}
	imshow(("效果"), src);
	waitKey(0);
	return 0;
}

Explicar

En la carga PPT en

26 artículos originales publicados · elogiados 0 · visitas 1206

Supongo que te gusta

Origin blog.csdn.net/weixin_44264994/article/details/103801958
Recomendado
Clasificación