2-2 opencv实战进阶系列 多边形识别

news2024/9/23 7:31:43

目录

一、不说废话,先上现象 

 二、前言

三、思路讲解

step1:用阈值编辑器对图像进行处理。

step2:应用阈值进行二值化

step3:轮廓查找

step4: 显示文字

四、完整代码贴出

五、现象展示

六、结语


一、不说废话,先上现象 

细心的人可以发现第二张图有几个四边形没有被识别到,至于原因下面会给出解释

 二、前言

本项目中,我们需要用到上个项目(2-1)中制作的阈值编辑器来对图形的颜色进行阈值提取,便于在代码中进行分割。

三、思路讲解

step1:用阈值编辑器对图像进行处理。

可以发现,对于重叠的图形需要,更加严格限制阈值才能将它们分离开,但是这样又会让掩膜覆盖掉阈值之外的图形。

解决方法是设置多个阈值对图片分割处理,让所有的图形都能够被识别到,最后对处理后的多个图像进行叠加。本文只展现一个阈值的处理,上述思路可自行尝试。

取灰度阈值(0,250) 

step2:应用阈值进行二值化

# 导入所需的库
import cv2
# 读取输入图像
img = cv2.imread('test3.png')
# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化灰度图像
mask_gray = cv2.inRange(gray, 0, 250)

step3:轮廓查找

# 找到轮廓
contours,hierarchy = cv2.findContours(mask_gray, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print("检测到的轮廓数量:",len(contours))

for cnt in contours:
   approx = cv2.approxPolyDP(cnt, 0.01*cv2.arcLength(cnt, True), True)
   if len(approx) == 4:
      img = cv2.drawContours(img, [cnt], -1, (0,170,255), 3)
  • cv2.findContours()函数用于在二值图像中找到所有轮廓(contours)。
    • cv2.RETR_TREE:检索所有轮廓,并重构嵌套轮廓的层级关系(即父子关系)。
    • cv2.CHAIN_APPROX_SIMPLE:只保存轮廓的拐点,从而减少内存使用。
    • contours:轮廓列表,每个轮廓由一系列点的坐标组成。
    • hierarchy:层次信息,描述轮廓的嵌套结构。

  • cv2.approxPolyDP()对轮廓进行多边形拟合,将轮廓点近似为一组直线段:
    • cv2.arcLength(cnt, True)计算轮廓的周长(曲线长度)。
    • 0.01 * cv2.arcLength()指定多边形拟合精度(越小拟合得越精确)。
    • True表示轮廓是闭合的。
    • approx是拟合的多边形轮廓。

  • cv2.drawContours()函数在原图像上绘制轮廓:
    • img:目标图像。
    • [cnt]:轮廓的列表。
    • -1:绘制所有轮廓点。
    • (0, 170, 255):轮廓颜色(BGR格式)。
    • 3:线条的厚度。

step4: 显示文字

      # 计算三角形质心
      M = cv2.moments(cnt)
      if M['m00'] != 0.0:
         x = int(M['m10']/M['m00'])
         y = int(M['m01']/M['m00'])
      cv2.putText(img, 'Rectangle', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 0), 2)

cv2.putText()函数在图像的质心位置添加标签“Rectangle”:

  • (x, y):标签文本的位置。
  • cv2.FONT_HERSHEY_SIMPLEX:字体类型。
  • 0.6:字体大小。
  • (0, 0, 0):文字颜色。
  • 2:文字的粗细。

四、完整代码贴出

# 导入所需的库
import cv2

# 读取输入图像
img = cv2.imread('test3.png')

# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 应用二值化将灰度图像转换为二进制图像
mask_gray = cv2.inRange(gray, 0, 250)

# 找到轮廓
contours,hierarchy = cv2.findContours(mask_gray, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print("检测到的轮廓数量:",len(contours))

for cnt in contours:
   approx = cv2.approxPolyDP(cnt, 0.01*cv2.arcLength(cnt, True), True)
   if len(approx) == 4:
      img = cv2.drawContours(img, [cnt], -1, (0,170,255), 3)

      # 计算三角形质心
      M = cv2.moments(cnt)
      if M['m00'] != 0.0:
         x = int(M['m10']/M['m00'])
         y = int(M['m01']/M['m00'])
      cv2.putText(img, 'Rectangle', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 0), 2)

cv2.imshow("mask_gray",mask_gray)
cv2.imshow("Shapes", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

五、现象展示

将此处修改为: if len(approx) == 10:

五角星被识别

六、结语

文章所展示的只是对图像中四边形的识别,若要同时对多个图形进行识别,可以增加多个判断条件“elif len(approx) == 5:” ,大家可以自行尝试。

博文到此结束,写得模糊或者有误之处,欢迎小伙伴留言讨论与批评

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2122311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在单向链表中找环

在单向链表中找环也是有多种办法,不过快慢双指针方法是其中最为简洁的方法之一,接下来介绍这种方法。 首先两个指针都指向链表的头部,令一个指针一次走一步,另一个指针一次走两步,如果它们相遇了,证明有环…

数据结构(7.2_1)——顺序查找

顺序查找,又叫"线性查找",通常用于线性表(或者顺序表和链表)。 算法思想:从头到尾全部查找出来(或者反过来也OK) 顺序查找的实现 typedef struct {//查找表的数据结构(顺序表)Elem…

再遇“类和对象”

一、类的默认成员函数 默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。一个类,我们不写的情况下编译器会默认生成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载不…

visio修改默认字体、颜色、形状格式、连接线格式

设计中取消勾选“将主题应用于新建的形状” 在开发工具中打开绘图资源管理器,并分别修改纯文本、连接线、主题的样式

文本转化为声音

在许多场景下需要将文本转化为MP3格式,本文将实现文本转化为声音,并且将声音保存为MP3格式。本文一朱自清的《春》为例,要实现阅读《春》并且转化为mp3格式的音频文件。 1 导入包 import pyttsx3 from docx import Document def read_word_…

ubuntu内核升级后的问题修复

文章目录 需求当前环境禁止内核更新安装内核修复/usr/include/dlocate 测试 需求 升级后的常见问题 驱动程序不兼容: 新内核版本可能导致某些硬件驱动程序不再兼容,尤其是专有驱动程序或第三方驱动程序。启动问题:内核更新可能导致启动问题,例如无法启动…

《创新电力巡检,机器人铸就安全高效未来》

近年来,我国电力建设投资额持续波动增长,至2023年底,全国电力工程投资总额高达14950亿元,同比增长22%。其中,电源工程建设和电网工程建设投资均达到新的高度。在这一背景下,电力行业对巡检工作的要求也日益…

苹果iOS/ iPadOS18 RC 版、17.7 RC版更新发布

iPhone 16 / Pro 系列新机发布后,苹果一同推出了 iOS 18 和 iPadOS 18 的 RC 版本,iOS 18 RC 的内部版本号为22A3354,本次更新距离上次发布 Beta/RC 间隔 12 天。 在 iOS 18 中,苹果给我们带来了 Apple Intelligence,这…

springboot高校兼职平台-计算机毕业设计源码65602

摘要 基于SpringBoot框架的高校兼职平台专注于为普通用户提供便捷的兼职信息服务。该平台包括普通用户功能、系统内容浏览、通知公告查看与论坛交流互动、兼职信息搜索与申请、个人中心管理和管理员权限管理等模块。利用SpringBoot框架实现了模块化开发和依赖注入,结…

驱动与应用的编译

无论是去驱动编译,还是应用编译,本质上都是用gcc这个工具,后面跟不同的参数来完成 驱动编译 放入内核编译 obj-y $(TARGET_SDK).o,就会直接将驱动编译成.o。供内核链接的时候,链接进整个内核镜像; obj-m…

Flutter自定义Icon的简易使用(两种)

方式一:利用第三方库(建议) 1、在阿里图标库(iconfont-阿里巴巴矢量图标库)上,加载购物车后,点击“下载素材”svg。 2、把下载的图片放入asstes目录下。​​​​​​​ 3、修改yaml配置文件,设置Icon图标所…

动态单窗口IP代理:提升网络操作的灵活性和安全性

互联网时代,各种网络工具层出不穷,而动态单窗口IP代理无疑成为了近年来的热门话题。今天,我们就来聊聊这个神奇的工具,看看它到底有什么独特之处。 什么是动态单窗口IP代理? 动态单窗口IP代理,顾名思义&a…

基于CogVideoX-2B的国产Sora文字一键生成视频

CogVideoX-2B是由THUDM团队开发的先进视频生成模型,利用最前沿的变压器技术,实现从文本到视频的高质量转换。无论是研究人员还是开发者,CogVideoX-2B都提供了一个强大的开源工具,用于视频合成和AI驱动的媒体创作。 本教程将详细介绍如何使用CogVideoX-2B,包括环境设置、模…

simd vs simt

GPU架构及运行机制学习笔记_gpu结构-CSDN博客 SIMD (Single Instruction, Multiple Data) 和 SIMT (Single Instruction, Multiple Threads) SIMD 架构是指在同一时间内对多个数据执行相同的操作,适用于向量化运算。例如,对于一个包含多个元素的数组&am…

震惊!立体连接:开启商业新模式的流量密码

摘要:本文深度揭秘在当今商业环境中立体连接的重大意义,揭示最佳匹配线下、社群和网络三度空间来实现认知、交易、关系三大功能的神奇之处。通过剖析开源链动 2 1 模式、AI 智能名片、S2B2C 商城小程序等元素在三度空间的运用,阐述如何达成最…

区块链学习笔记2--区块链技术的形成 以太坊

分布式数据存储: 在每个参与者电脑上备份 账本实时同步和对账 点对点通信 共识机制 加密算法: 对用户个人信息的加密 转账过程中的签名授权 账本一致性校验 挖矿算法的目标hash 区块链2.0技术 以太坊 比特币的出现让经济贸易变得简单,而比特…

【数据结构-二维前缀和】力扣221. 最大正方形

在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。 示例 1: 输入:matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”…

Jupyter Notebook设置代码提示和自动代码补全

算法学习、4对1辅导、论文辅导或核心期刊可以通过公众号滴滴我 文章目录 在使用Jupyter Notebook中,会出现Jupyter不像Pycharm一样,可以 自动补全代码以及 代码方法提示等功能,这时候就需要通过给Jupyter安装插件来进行实现。 执行步骤&#…

刘慈欣:不管未来的技术怎么发展 对文化的冲击肯定会发生

导语 刘慈欣坦承,《三体》里面特别是第一部关于量子的关键描述是错误的,“说量子纠缠能够超高速通讯不太可能,当时也知道不能通讯,但为了这个故事能讲下去就把它写进去了,我没想到在后来有这么大的影响力。”   4月2…

2024年CCPC网络赛C题题解 —— 种树(gym105336C)

一道不错的树形dp题,想要提升树形dp的糕手们可以做一下,放上题面: 题意:给你一个有0有1的数,每次可以把一个大小为3(包含3个结点)的结构中,要求至少包含一个1,然后就能把…