文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python opencv进行矩形识别

2023-09-03 10:04

关注

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯