图像识别中,圆形和矩形识别是最常用的两种,上一篇讲解了圆形识别,本例讲解矩形识别,最后的结果是可以识别出圆心,4个顶点,如下图:
左边是原始图像,右边是识别结果,在我i5 10400的CPU上,执行时间不到8ms。
识别出结果后,计算任意3个顶点的彼此距离,共3个数据,其中数值最小值对应的2个顶点是短边,数值最大的2个顶点对应矩形的对角线,中间那个值的矩形的长边。如果是正方形,则最小值和中间值相等。知道了长边的2个点,也就很容易求得矩形的旋转方向,在机器人捡拾物品的过程中,也就知道了末端执行器的旋转角度值。
1 高斯模糊
blur = cv2.GaussianBlur(resized, (5, 5), 0) # 高斯模糊, 窗口为5x5, 标准差为0
高斯模糊,或者叫高斯滤波,其中resized是输入的图像数组,blur是输出的图像数组,(5,5)是一个5*5的卷积核,可大可小,但必须为奇数。这一步是消除图像中的噪声,以免其影响识别结果。
2 图像格式转换
RGB格式
img = cv2.imread(".\\img\\save2.jpg")
图像加载后,默认就是RGB格式。
常见照片的图像格式是RGB或RGBA的,也就是红绿蓝通道,再加上透明度通道。
如果我们要识别的图像中,与颜色有关,如只要识别红色的物体,那我们就用RGB格式进行处理,并提取其中的一个通道。如下图,在红色通道中,红色物体的亮度最高,其他同理。
但是显然,下图中,在红色通道要提取红色并不容易,因为红色通道中红色和背景的颜色差不多,难以将前景与背景分离。而绿色通道和蓝色通道,对红色的识别度更好些。
HLS格式
lab = cv2.cvtColor(blur, cv2.COLOR_RGB2HLS) # 转为HLS图像模式, 此模式区分颜色简单, 同时处理速度快
如果与颜色无关,需要识别时,可以考虑采用HLS色彩模式进行。这个色彩模型是由色调,饱和度,亮度3个通道构成,如下:
可以看出,L通道的轮廓最明显,因此可以使用该通道来做图像识别。
同样对于需要提取的红色物体,可以在识别出矩形之后,取矩形中心点(更好的是中心一小块区域的平均值)的颜色值,再自己判断一下颜色,即可筛选出想要的红色矩形了。
3 通道分离
这其实是对numpy数组的操作
channel_h = lab[:, :, 0] # 提取H通道 色相channel_l = lab[:, :, 1] # 提取L通道 明度channel_s = lab[:, :, 2] # 提取S通道 饱和度
4 二值化
ret_val, bin_channel_l = cv2.threshold(channel_l.copy(), 170, 255, cv2.THRESH_BINARY_INV) # 复制L通道, 并二值化
第1个参数是复制一次L通道
第2个参数:170 是阈值
第3个参数:255 是填充值
第4个参数是模式,即二值化,还是反二值化,本例是反二值化
5 查找轮廓
contours = cv2.findContours(bin_channel_l, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
第1个参数是图像数组
第2个参数是查找模式,当前模式为查找最外面的轮廓,对于轮廓内部的轮廓,则不查找
第3个参数是输出所有轮廓点的信息
查找的轮廓点会有很多组,面积大小也不一,本例中只关心4个顶点的轮廓,也就是矩形。
面积大小可以设一个阈值,小于这个阈值的矩形也不是我们想要的。根据矩形长宽所占用的像素值,乘一下就是该矩形的面积,超过这个阈值的矩形,就是我们想要的。
最后,如果要对颜色进行筛选,则可以从矩形的中心取一个5x5的矩形,对其RGB的值分别进行求和,再除以25(5x5),即是该区域的颜色值。
将以下代码复制到IDE中即可,需要事先安装好python, opencv, numpy等相关运行库
# coding: UTF-8# 作者: 李佳# Email: 36566686@qq.com# WeChat: laolidesenlin# Date: 2020/4/1 20:09# Filename:detect_rect.PY# SoftTool:PyCharm__author__ = '李佳'import cv2import timeimport numpy as npdef draw_rect(img, rect_point):
来源地址:https://blog.csdn.net/13011803189/article/details/129184510