Opencv+Python笔记(八)轮廓检测

news2024/12/23 17:27:50

目录

    • 一、轮廓的检测和绘制
      • 1.读入图像
      • 2.将读入图像转化为灰度图
      • 3.对灰度图进行二值化 [图像的阈值化处理](https://blog.csdn.net/Ggs5s_/article/details/130301816?spm=1001.2014.3001.5501)
      • 4.进行轮廓检测
      • 5.在原图中显示轮廓
    • 二、轮廓层级关系
      • 1.RET_LIST
      • 2.RETR_EXTERNAL
      • 3. RETR_CCOMP
      • 4.RETR_TREE
    • 三、轮廓特征
      • 1.轮廓周长
      • 2.轮廓面积
      • 3.轮廓近似

一、轮廓的检测和绘制

轮廓检测有什么作用:
使用轮廓检测可以获得物体的边界,方便在图像中对他们进行定位。

什么是轮廓:
当我们把物体边缘所有的点连接在一起可以获得轮廓。对于特定的轮廓是指那些具有相同颜色和亮度的边界点像素。

调用流程:
(1)读入图像
(2)将读入图像转化为灰度图
(3)对(2)得到的灰度图进行二值化或者Candy边缘检测处理,从而把感兴趣的物体加亮凸显出来以便于使用轮廓检测算法
(4)进行轮廓检测(使用 findContours()函数来检测图像中的所有的轮廓)
(5)在原图中显示轮廓(使用 drawContours()函数来在原图上显示轮廓)

1.读入图像

img = cv2.imread('img.jpg')

2.将读入图像转化为灰度图

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

3.对灰度图进行二值化 图像的阈值化处理

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

4.进行轮廓检测

Opencv API:

contours, hierarchy = cv2.findContours(img,mode,method)

参数:
contours:检测到的轮廓,每个轮廓是由一些点构成的向量组成
hierarchy:记录轮廓之间的层级关系,四个维度分别代表:同级后一个轮廓的序号、同级上一个轮廓的序号、第一个孩子序号,父亲序号
mode:检测轮廓的层级关系排列规则:(1)RETR_EXTERNAL:仅仅检测外圈轮廓;(2)RETR_LIST:检测所有轮廓,但是没有层级关系;(3)RETR_CCOMP:仅仅两层包含关系,即只有外层和内层,假设有夹层,那么夹层也算外层,只要某个轮廓还包含有轮廓,都算外部轮廓;(4)RETR_TREE:检测所有的轮廓,并存储非常完整的层级关系,一般都用这个 把所有轮廓都存下来以后用得到哪个就拿哪个
method:轮廓点的存储方式:(1)CHAIN_APPROX_NONE:将要存储的轮廓整个存储下来;(2)HAIN_APPROX_SIMPLE:该算法对水平、垂直以及对角线方向的片段轮廓进行了省略,仅仅保存了他们的端点。这意味着所有直线上的点都会消失,只保存端点信息,比如矩形就只保存四个顶点。这种模式先处理速度要比CHAIN_APPROX_NONE更快,所需要的内存更少,因此执行时间就会被节省。

5.在原图中显示轮廓

Opencv API:

img = cv2.drawContours(img, contours, index, color, thickness, linetype)

参数:
contours:是list类型的数组,里面存储了轮廓数组包含所有存储的轮廓
contourIdx:从上面的轮廓list中取出哪一个画出来,-1代表全部
color:绘制轮廓所用颜色
thickness:线条粗细,-1代表填充式画轮廓,整个轮廓内部被指定颜色填充
lineType:线条类型,虚线、实线之类的,默认实线

注意:
绘制轮廓钱要做一个原图的副本,图片传入绘制轮廓函数后,会在该图片上画出轮廓从而使得该图片无法使用

二、轮廓层级关系

多数情况下,如果一个形状中包含有其它形状,我们一般认为外边形状是出内部形状的父亲。
在这里插入图片描述

其中4a为4的内侧轮廓,5a为5的内侧轮廓
OpenCV 用 [Next, Previous, First_Child, Parent] 表示轮廓层级关系信息。即返回值hierarchy。

next:同层级的下一个轮廓,若不存在则为-1
previous:同层级的上一个轮廓,若不存在则为-1
first_child:该轮廓的第一个孩子结点,不存在则为-1
parent:该轮廓的父亲结点,不存在则为-1

然后来解释一下mode的四个轮廓获取方法

1.RET_LIST

该轮廓获取方法不创建任何父子关系,直接存储,如图:
在这里插入图片描述

2.RETR_EXTERNAL

该轮廓检测方法仅仅存储父亲轮廓,子孙轮廓被忽略,如图:
在这里插入图片描述

3. RETR_CCOMP

该轮廓检测算法将轮廓赋值为 2 个级别。所有的外部轮廓都是层级1,所有的内部轮廓都是层级2; 如果内部还有其他内部层级,循环使用级别1 和 2。

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

4.RETR_TREE

RETR_TREE获得所有的轮廓并检索所有轮廓并创建一个家族,告诉谁是儿子,谁是孙子,谁是父亲,谁是祖父,如图:
在这里插入图片描述


代码:

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  #检测轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (255, 0, 0), 2)  #绘制轮廓

titles = ['origin', 'contours']
imgs = [img, res]
plt_show(2, 1, 2, titles, imgs)

在这里插入图片描述

三、轮廓特征

1.轮廓周长

Opencv API:

leng = cv2.arcLength(cnt, isClosed)  

参数:
cnt:所要检测周长的轮廓
isClosed:标志位,若为True表示轮廓闭合,若为False表示轮廓不闭合

2.轮廓面积

Opencv API:

area = cv2.contourArea(cnt)

3.轮廓近似

Opencv API:

cv2.approxPolyDP(curve, epsion, isClosed)

参数
curve 轮廓
epsion 原始轮廓和近似多边形之间的最大误差δ值 精度越高越逼近原始轮廓
isClosed 布尔标志,如果是True,表示多边形是闭合的

代码:

cnt = contours[2]
epsilon = 0.1 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)

draw_img = img.copy()
res = cv2.drawContours(draw_img, [approx], -1, (255, 0, 0), 2)
cv_show('res', res)

在这里插入图片描述

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

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

相关文章

座椅内饰如何「跟上」智能电动?这款智能概念座舱看到未来

进入智能电动汽车时代,理想的车内空间应该是怎样的?作为“内饰空间创造者”、全球三大汽车座椅及内饰厂商之一,丰田纺织在2023上海车展上给出了一系列解决方案。 4月19日,丰田纺织携诸多产品亮相本次上海车展,包括面向…

【速卖通】 AliExpress(速卖通)关键词搜索结果采集

采集场景 在AliExpress(速卖通) 首页中 http://www.aliexpress.com 中输入关键词,采集关键词搜索后得到的商品列表信息。 采集字段 关键词、标题、商品id、商品图片地址、商品详情链接、价格、免费退送货、星级、已出售数量、店铺名 采集结果 采集结果可导出为E…

C语言入门篇——函数篇

1、什么是函数 首先,什么是函数?函数(function)是完成特定任务的独立程序代码。单元语法规则定义了函数的结构和使用方式。虽然C中的函数和其他语言中的函数、子程序、过程作用相同,但是细节上略有不同。 为什么使用函数? 首先…

刷题训练2之AcWing第 96 场周赛

竞赛 - AcWing 一、完美数 4876. 完美数 - AcWing题库 1、题目 如果一个正整数能够被 2520 整除,则称该数为完美数。 给定一个正整数 n,请你计算 [1,n]范围内有多少个完美数。 输入格式 一个整数 n。 输出格式 一个整数,表示 [1,n] 范…

【社区图书馆】操作系统的经典书籍

操作系统的经典书籍 一、引言二、书籍的选择三、优缺点3.1、《操作系统》3.2、《计算机操作系统》 小结 一、引言 《操作系统》罗宇和《计算机操作系统》汤小丹这两本书都是关于操作系统的经典书籍,各有优势。 二、书籍的选择 首先,从内容深度上&…

倾斜摄影超大场景的三维模型的顶层合并常见的问题分析

倾斜摄影超大场景的三维模型的顶层合并常见的问题分析 倾斜摄影超大场景的三维模型顶层合并是将多个局部区域的点云或网格数据进行融合,生成一个整体的三维模型的过程。在这个过程中,常见的问题包括: 1、数据不一致。由于数据采集时间、空间…

SAP SM30表格维护生成器隐藏记录日志字段

1.背景 在表格维护生成器中往往会隐藏记录日志字段,不让用户直接查看,而供运维或者开发部门使用,如下所示: 2.实现 2.1 SM30逻辑流和屏幕元素中删除日志记录字段 2.2 创建事件,写入记录日志代码 2.2.1 记录日志方式…

Node.js使用CORS解决跨域问题的三种方法

目录 1、通过CORS中间键解决2、设置响应头3、app.all解决4、解决跨域问题案例 现如今,实现跨域数据请求,最主要的两种解决方案,分别是JSONP和CORS. JSONP:出现的早,兼容性好(兼容低版本IE)。是前端程序员为…

m1下利用dockerdesktop安装ELK

一、背景:公司有一个需求,就是将txt中的数据加载到es中,之前没用过es,想着先在本地安装一个,然后再做测试。 二、安装docker desktop 打开docker的官网,下载苹果芯片的docker 网址:https://ww…

当DevOps遇见AI,智能运维的黄金时代开启

文章目录 1. 当DevOps遇见AI,智能运维的黄金时代2. 什么是DevOpts?改变开发格局:测开、运开必然趋势3. 什么是Docker容器化,它会替代掉VM虚拟机吗?4. 运维的终点是开发5. 实际项目的部署案例6. 誉天程序员课程 1. 当De…

顶象推出应用隐私合规检测服务

为帮助开发者更高效地进行App隐私合规检测,顶象推出应用隐私合规检测服务,快速发现App可能存在的各类隐私安全漏洞,并提供详细的检测报告,给出专业的合规整改建议。该服务可应用于上架前和合规检测,通过个人信息保护分…

map<int,int>和map<int,int>::iterator

map< int,int >和map< int,int >::iterator 一、map<int,int>、map<string, string>的含义二、map<int,int>::iterator的作用三、map<int,XXX>的自动升序特点 一、map<int,int>、map<string, string>的含义 map容器是CSTL的一…

学成在线笔记+踩坑(7)——绑定媒资

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题 目录 8 绑定媒资 8.1 需求分析 8.1.1 业务流程 8.1.2 数据模型 8.2 接口定义 8.2.1 抽取模型类 8.2.2 定义接口层 8.3 接口开发 8.3.1…

23.4.21总结

正则表达式 正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串&#xff0c;通常被用来检索、替换那些符合某个模式&#xff08;规则&#xff09;的文本。 正则表达式是一种对字符串操作的一种逻辑公式&#xff0c;就是用事先定义好的一些特定字符、及这些…

【Java 数据结构】十大排序 (动图解析)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

微搭低代码学习之销售员销售目标采集系统开发

四月二十三&#xff0c;春意渐浓&#xff0c; 草木抽出新枝&#xff0c;鸟儿唱响欢融。 花开满园&#xff0c;香气袭人&#xff0c; 阳光明媚&#xff0c;人们心情舒畅。 愿这美好的日子&#xff0c;伴随你一生。 ——使用Notion AI提问“写一首关于4月23日的诗” 文章目录 前言…

【深度学习入门系列】 pytorch实现多层感知机(MLP)(内含分类、回归任务实例)

文章目录 0. BP和MLP1 分类1.0 数据集1.1 网络架构1.2 代码1.3 结果 2 回归2.0 数据集2.1 网络架构2.2 代码2.3 结果 3 代码&#xff08;可直接食用&#xff09; 众所周知&#xff0c;sklearn提供了MLP函数。个人认为这个东西虽然蛮好用的——有的时候比你自己写的效果都好&…

Linux应用程序开发:进程的一些事儿

目录 一、进程的简介1、什么是进程&#xff0c;进程的概念2、进程状态3、什么是进程号4、进程间的通信方法&#xff08;IPC&#xff09; 二、 fork()创建子进程三、父、 子进程间的文件共享1、实验12、实验2 四、使用execl函数执行新程序五、关于终端上对进程的一些指令操作六、…

AI绘图风格对照表/画风样稿详细研究记录及经验总结(分析Midjourney和Stable Diffusion风格提示词实际使用情况)不断更新中...

Midjourney和Stable Diffusion都可以通过输入文本生成出令人惊叹的AI图像。 Midjourney是一个收费的在线服务&#xff0c;通过discord对话的形式来生图&#xff0c;局限性较大&#xff0c;但由于后台官方模型做得好&#xff0c;因此出图效果非常完美&#xff1b; Stable Diffus…

3.Spring Security实现JWT token验证

目录 1. Spring Security详细介绍 2. Spring Security详细使用 3. Spring Security实现JWT token验证 4. JWT&#xff08;JSON Web Token&#xff0c;JSON令牌&#xff09; 5. Spring Security安全注解 Spring Security实现JWT token验证 Spring Security是Spring提供的一…