type
status
date
slug
summary
tags
category
icon
password

cv2.findContours()

之前在魔方机器人的图像处理中,提到了一下这个函数。好像还没有搬过来,有兴趣的可以直接去CSDN瞟一眼,后续会逐渐搬到NOTIONNEXT上。
当时在寻找封闭多边形中使用到了这个函数,但是对于这个函数的理解并不深刻,对于contours和hierarchy这两个返回值的理解并不深刻。contours是轮廓,但是这个轮廓是怎么提取的,轮廓是如何储存的。hierarchy代表什么意思并没有深究,只是简单的绘制一下魔方的最终图案,进来就来学习一下这个函数。
PS:这里的分析都是针对opencv-python中的形式,在其他语言中opencv的元素存储形式并不一致。

版本区别

注意在opencv3.2版本之前,findcontours会返回三个值,会对原始图像进行修改并返回。下面是3.2版本之前的示例。
3.2版本开始后,findcontuors不再对原始图像进行修改,只返回contours和hieraarchy两个返回值。

返回值说明

 

contours

contours储存了边界中的所有的点坐标。这里继续拿之前的魔方图像检测的图片和代码来进行说明。
使用二值化之后的魔方一面图像进行处理。
 

hierarchy

这个表示每一个形状的属性,也就是层级属性。每一个轮廓包含四个参数,这四个参数表示如下:
notion image
一般我们在使用cv2.RETR_EXTERNAL时,由于只检测外侧轮廓,所以是没有层级的。但是上述代码中我们建立这个层级树,就可以建立父子层级了。
依然以上述代码中的参数为例,输出一下hierarchy,输出结果如下:
可以看到,整个轮廓树包含父子关系。使用第二个轮廓举例,他的最后一位也就是他的父轮廓是轮廓0,他的子轮廓是轮廓2。
 

参数说明

image

这个就不用多说了,就是原始图像

mode

这个参数包含四个模式
cv2.RETR_EXTERNAL
只检测外轮廓
cv2.RETR_LIST
建立轮廓,但不建立等级关系
cv2.RETR_CCOMP
建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE
建立一个等级树结构的轮廓

method

这个是返回数据的表示方法
cv2.CHAIN_APPROX_NONE
直接存储轮廓点,max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE
压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
 
 

代码链接

tips_for_blog
Zachary19980701Updated Jul 21, 2023
 

参考链接

Topological Structural Analysis of Digitized Binary Images by Border Following
 
【好文分享】如何比较两个或多个分布形态移动机器人安全控制与强化学习(1)安全控制