基于形状的零件识别

9 篇文章 0 订阅
7 篇文章 0 订阅

螺母识别

螺母外轮廓为正六边形,最小外接矩形为正方形,该程序较为简单,判断其外接矩形近似于正方形即为螺母。

在这里插入图片描述
在这里插入图片描述

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

实现方式简单明了,但问题也暴露很明显,例如改变拍照角度影响很大。另外,图像处理方法有待改善,例如背景复杂会导致误识别。
该方法最大的问题就是:只要能识别出近似正方形,该对象就会被认定为螺母。
后面用其他方法继续改进。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前言: 开源的opencv真是一件伟大的产品,那么多个函数跟变量(具体多少还没数过)。要是结合起来综合运用几乎可以胜任任何有关图像识别和处理方面的工作。如果能更深入一点根据具体需要修改或优化里面的源码那更是如虎添翼。 花了点时间浏览了www.opencv.org.cn论坛里的所有贴子,还好不多才200多页。总体上对opencv里的一些常用函数功能作用大致有点了解,筛选一些跟元件识别有关的运用内容,但它论坛里的贴子回复的内容点到即止的居多。从网上下载了能搜到的教程跟代码全学习了解测试了一下,图像处理流程通常先开始都是要进行滤波,除燥,灰度,二值化后再轮廓识别等。 开始动手 经过多次好多次运行测试组合,终于有一次显示出意外的惊人效果,而且相当简单只是调用了几个函数而以,就可以有这样效果实在出人意料。第一个是进行元件中心点获取,也是直接调用函数再加点东西就可以得出元件的四个矩形顶点坐标,有这几个坐标就可以直接算出元件中间点所在的坐标了。如果要检测元件摆放角度是否是垂直90度,只要判断边宽的长度为最小或最大时就是垂直90度。 但这个矩形框无法测出元件具体角度。如截图: 测试视频地址:https://v.youku.com/v_show/id_XMjU5NzY5NTI0.html 不过,还有另外一个函数可以提供这个功能,调用后可以直接求出最小外接矩形和角度 如截图: 测试视频地址:https://v.youku.com/v_show/id_XMjYwMDMzMDc2.html 说明:里面的光源不行,临时用手电筒,和在光盘上插几个LED做环形灯做照明,无法做到无阴影显示。如果光源做的好,效果应该是非常精确稳定。 识别包含下面2种做法: opencv里需要的头文件跟库文件都已编译好放在和设置在当前程序目录下,就可不用安装opencv 也能直接编译。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值