Python opencv进行矩形识别

本文介绍如何使用Python的OpenCV库进行矩形识别,详细讲解了高斯模糊、图像格式转换(RGB与HLS)、通道分离、二值化和查找轮廓等关键步骤。通过识别出的矩形顶点,可以计算长边和短边以确定矩形的旋转角度,适用于机器人定位等场景。
摘要由CSDN通过智能技术生成

Python opencv进行矩形识别

图像识别中,圆形和矩形识别是最常用的两种,上一篇讲解了圆形识别,本例讲解矩形识别,最后的结果是可以识别出圆心,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 cv2
import time
import numpy as np


def draw_rect(img, rect_point)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值