opencv函数findcontours_OpenCV系列之轮廓入门 | 二十一
目标
- 了解轮廓是什么。
- 学习查找轮廓,绘制轮廓等。
- 你将看到以下功能:cv.findContours(),cv.drawContours()
什么是轮廓?
轮廓可以简单地解释为连接具有相同颜色或强度的所有连续点(沿边界)的曲线。轮廓是用于形状分析以及对象检测和识别的有用工具。
- 为了获得更高的准确性,请使用二进制图像。因此,在找到轮廓之前,请应用阈值或canny边缘检测。
- 从OpenCV 3.2开始,findContours()不再修改源图像。
- 在OpenCV中,找到轮廓就像从黑色背景中找到白色物体。因此请记住,要找到的对象应该是白色,背景应该是黑色。
让我们看看如何找到二进制图像的轮廓:
import numpy as npimport cv2 as cvim = cv.imread('test.jpg')imgray = cv.cvtColor(im, cv.COLOR_BGR2GRAY)ret, thresh = cv.threshold(imgray, 127, 255, 0)contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
findcontour()函数中有三个参数,第一个是源图像,第二个是轮廓检索模式,第三个是轮廓逼近方法。输出等高线和层次结构。轮廓是图像中所有轮廓的Python列表。每个单独的轮廓是一个(x,y)坐标的Numpy数组的边界点的对象。
注意稍后我们将详细讨论第二和第三个参数以及有关层次结构。在此之前,代码示例中赋予它们的值将适用于所有图像。
如何绘制轮廓?
要绘制轮廓,请使用cv.drawContours函数。只要有边界点,它也可以用来绘制任何形状。它的第一个参数是源图像,第二个参数是应该作为Python列表传递的轮廓,第三个参数是轮廓的索引(在绘制单个轮廓时有用。要绘制所有轮廓,请传递-1),其余参数是颜色,厚度等等
在图像中绘制所有轮廓:
cv.drawContours(img, contours, -1, (0,255,0), 3)
绘制单个轮廓,如第四个轮廓:
cv.drawContours(img, contours, 3, (0,255,0), 3)
但是在大多数情况下,以下方法会很有用:
cnt = contours[4]cv.drawContours(img, [cnt], 0, (0,255,0), 3)
注意最后两种方法相似,但是前进时,您会发现最后一种更有用。
轮廓近似方法
这是cv.findContours函数中的第三个参数。它实际上表示什么?上面我们告诉我们轮廓是强度相同的形状的边界。它存储形状边界的(x,y)坐标。但是它存储所有坐标吗?这是通过这种轮廓近似方法指定的。如果传递cv.CHAIN_APPROX_NONE,则将存储所有边界点。但是实际上我们需要所有这些要点吗?例如,您找到了一条直线的轮廓。您是否需要线上的所有点来代表该线?不,我们只需要该线的两个端点即可。这就是cv.CHAIN_APPROX_SIMPLE所做的。它删除所有冗余点并压缩轮廓,从而节省内存。下面的矩形图像演示了此技术。只需在轮廓数组中的所有坐标上绘制一个圆(以蓝色绘制)。第一幅图像显示了我用cv.CHAIN_APPROX_NONE获得的积分(734个点),第二幅图像显示了我用cv.CHAIN_APPROX_SIMPLE获得的效果(只有4个点)。看,它可以节省多少内存!!!
☆☆☆为方便大家查阅,小编已将OpenCV-Python专栏文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“文章”,如图:
不断更新资源
获取更多精彩
长按二维码扫码关注
opencv函数findcontours_OpenCV系列之轮廓入门 | 二十一相关推荐
- OpenCV系列之轮廓入门 | 二十一
目标 了解轮廓是什么. 学习查找轮廓,绘制轮廓等. 你将看到以下功能:cv.findContours(),cv.drawContours() 什么是轮廓? 轮廓可以简单地解释为连接具有相同颜色或强度的 ...
- opencv函数findcontours_OpenCV 中的轮廓应用
目录: 轮廓常用函数 第一个应用 第二个应用 轮廓就是连接所有连续点(沿着边界)的曲线,具有相同的颜色或灰度值.轮廓是形状分析.物体检测和识别的有用工具.为了提高提取轮廓的精确度,需要先通过阈值处理或 ...
- OpenCV系列之轮廓属性 | 二十三
在这里,我们将学习提取一些常用的物体属性,如坚实度,等效直径,掩模图像,平均强度等.更多的功能可以在Matlab regionprops文档中找到. (注:质心.面积.周长等也属于这一类,但我们在上一 ...
- java 案例 一千例,【发现问题、解决问题系列案例分享(二十一)】 一个自动执行命令,每天节省一千分钟!...
原标题:[发现问题.解决问题系列案例分享(二十一)] 一个自动执行命令,每天节省一千分钟! 编辑 | 林采依 撰文 |钱奕昀 嘉定局 在用户信息安全检测中,营业厅电脑因受理业务时需使用安真通 无纸化拍 ...
- OpenCV系列之轮廓分层 | 二十五
目标 这次我们学习轮廓的层次,即轮廓中的父子关系. 理论 在前几篇关于轮廓的文章中,我们已经讨论了与OpenCV提供的轮廓相关的几个函数.但是当我们使用cv.findcontour()函数在图像中找到 ...
- CarSim仿真快速入门(二十一)-CarSim: 车轮箭头动画和其他指示动画
CarSim2022中的动画是:车轮箭头和其他指标界面用于定义一组轮胎力或其他感兴趣的变量的视觉动画指标,这些指标在仿真车辆的每个车轮.轮胎或车轴上重复出现. 所有VehicleSim(VS)产品都包 ...
- conan入门(二):conan 服务配置-密码管理及策略
conan 服务配置 密码管理及策略配置 第一次以管理员身份(admin)使用默认密码(password)WEB登录入JFrog Artifactory后台时,系统就提示要求我修改密码,因为现有密码太 ...
- conan入门(二十):封装只包含头文件(header_only)的库示例
conan: 封装只包含头文件(header_only)的库示例 有的C/C++项目只包含头文件,不需要编译,对于这种情况如何封装为Conan的包呢? Conan官方文档 <Package sc ...
- SpringBoot和Vue集成Markdown和多级评论——基于SpringBoot和Vue的后台管理系统项目系列博客(二十三)
系列文章目录 系统功能演示--基于SpringBoot和Vue的后台管理系统项目系列博客(一) Vue2安装并集成ElementUI--基于SpringBoot和Vue的后台管理系统项目系列博客(二) ...
最新文章
- 范登读书解读《亲密关系》(婚姻、爱情) 笔记
- 真我与小我隔着什么?
- DirectUI介绍
- 使用PaddleFluid和TensorFlow训练序列标注模型
- SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结
- JSON特殊字符处理
- CAN笔记(21) 服务数据对象
- idea 拉取gitee代码_手把手撸一个 IDEA 插件
- AI空谈情怀,也是要输的 | 人机辩论大战
- Enfocus PitStop Pro 2021 for Mac(pdf增强插件)
- 详解CAN总线:CAN协议分层结构及功能
- [Anaconda学习]本地查看代理ip,anaconda挂代理
- JavaScript斐波那契数列兔子问题
- 人工智能学习前的简单了解
- 多项式的各类计算(多项式的逆/开根/对数/exp/带余除法/多点求值)
- uniapp 判断手机网络状态
- 芯片CP/FT测试的基本概念理解
- 2023 zibll 子比主题 美化插件 全开源
- 中文乱码与字体库windows
- win10下实现负载均衡
热门文章
- where is ConstraintViolationException raised
- SAP CRM enterprise search index调试细节
- ABAP webdynpro的view navigation和WebUI的view navigation
- SAP Cloud for Customer的CTI呼叫中心解决方案
- 有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了?
- SAP CRM 中间件对物料batch ID的处理
- 如何在SAP云平台ABAP编程环境里创建自己的Z表
- Cloud for Customer里点了Opportunity ID的超链接到进入overview page,背后发生了什么事?
- SAP UI技术演进过程
- Jerry的Fiori原创文章合集