Reconhecimento de peça baseado em forma

Identificação da porca

O contorno externo da porca é um hexágono regular, e o menor retângulo circunscrito é um quadrado. O programa é relativamente simples, e julga-se que o retângulo circunscrito é semelhante a um quadrado, que é a porca.

insira a descrição da imagem aqui
insira a descrição da imagem aqui

#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>

using namespace cv;
using namespace std;

int main()
{
    
    
	Mat img = imread("D:/PyCharm/pythonProject/OpenCV-py/parts/17.png");
	if (img.empty())
	{
    
    
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}

	Mat img2;
	img.copyTo(img2);  //深拷贝用来绘制最小外接矩形
	imshow("img", img);

	Mat gray;//灰度处理
	cvtColor(img, gray, COLOR_BGR2GRAY);  //转化成灰度图

	//GaussianBlur(gray, gray, Size(5, 5), 4, 4);  //平滑滤波
	//imshow("GaussianBlur", gray);

	Mat canny;	// 去噪声与二值化
	Canny(gray, canny, 80, 255, 3, false);//?3是sobel直径 不能改动
	imshow("canny detect", canny);

	//膨胀运算,将细小缝隙填补上
	Mat kernel = getStructuringElement(0, Size(10, 10));
	dilate(canny, canny, kernel);
	imshow("dilate", canny);

	// 轮廓发现与绘制
	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(canny, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());//RETR_EXTERNAL//RETR_LIST

	//寻找轮廓的外接矩形
	for (int n = 0; n < contours.size(); n++)
	{
    
    

		// 最小外接矩形
		RotatedRect rrect = minAreaRect(contours[n]);
		Point2f points[4];
		rrect.points(points);  //读取最小外接矩形的四个顶点
		Point2f cpt = rrect.center;  //最小外接矩形的中心
		int x = rrect.size.height;
		int y = rrect.size.width;
		cout << "min 长" << x << " " << "宽" << y << endl;
		if ((rrect.size.width > 0.8 * rrect.size.height) && (rrect.size.width < 1.2 * rrect.size.height)) //长宽比 0.8长<宽<1.2长
									 // 绘制旋转矩形与中心位置
		{
    
    
			for (int i = 0; i < 4; i++)
			{
    
    
				if (i == 3)
				{
    
    
					line(img2, points[i], points[0], Scalar(0, 255, 0), 2, 8, 0);

					break;
				}
				line(img2, points[i], points[i + 1], Scalar(0, 255, 0), 2, 8, 0);
			}
			//绘制矩形的中心
			circle(img, cpt, 2, Scalar(255, 0, 0), 2, 8, 0);
			putText(img2, "nut", Point(cpt), 2, 1, Scalar(0, 0, 255));
		}
	}

	//输出绘制外接矩形的结果
	imshow("min", img2);
	waitKey(0);
	return 0;
}

O método de implementação é simples e claro, mas os problemas também são expostos, por exemplo, mudar o ângulo da câmera tem um grande impacto. Além disso, o método de processamento de imagem precisa ser melhorado, por exemplo, o fundo complexo levará a erros de identificação.
O maior problema desse método é que, desde que um quadrado aproximado possa ser identificado, o objeto será identificado como uma noz.
Continue a melhorar com outros métodos mais tarde.

Acho que você gosta

Origin blog.csdn.net/qq_46248455/article/details/122028052
Recomendado
Clasificación