函数 cv.findContours
contours, hierarchy = cv.findContours( image, mode, method[, contours[, hierarchy[, offset]]] )
- 参数1:源图像
- 参数2:轮廓的检索方式,这篇文章主要讲解这个参数
- 参数3:一般用 cv.CHAIN_APPROX_SIMPLE,就表示用尽可能少的像素点表示轮廓
- contours:图像轮廓坐标,是一个链表
- hierarchy:[Next, Previous, First Child, Parent],文中有详细解释
我们使用cv.findContours()寻找轮廓时,参数2表示轮廓的检索方式(RetrievalModes),当我们传入的是cv.RETR_TREE,它表示什么意思呢?另外,函数返回值hierarchy有什么用途呢?下面我们就来研究下这两个问题。
理解轮廓层级

图中总共有8条轮廓,2和2a分别表示外层和里层的轮廓,3和3a也是一样。从图中看得出来:
- 轮廓0/1/2是最外层的轮廓,我们可以说它们处于同一轮廓等级:0级
- 轮廓2a是轮廓2的子轮廓,反过来说2是2a的父轮廓。轮廓2a算一个等级:1级
- 同样3是2a的子轮廓,轮廓3处于一个等级:2级
- 类似的,3a是3的子轮廓,等等…………
这里面OpenCV关注的就是两个概念:同一轮廓等级和轮廓间的子属关系。
如果我们打印出cv.findContours()函数的返回值hierarchy,会发现它是一个包含4个值的数组:[Next, Previous, First Child, Parent]
Next:与当前轮廓处于同一层级的下一条轮廓
举例来说,前面图中跟0处于同一层级的下一条轮廓是1,所以Next=1;同理,对轮廓1来说,Next=2;那么对于轮廓2呢?没有与它同一层级的下一条轮廓了,此时Next=-1。
Previous:与当前轮廓处于同一层级的上一条轮廓
跟前面一样,对于轮廓1来说,Previous=0;对于轮廓2,Previous=1;对于轮廓2a,没有上一条轮廓了,所以Previous=-1。
First Child:当前轮廓的第一条子轮廓
比如对于轮廓2,第一条子轮廓就是轮廓2a,所以First Child=2a;对轮廓3,First Child=3a。
Parent:当前轮廓的父轮廓
比如2a的父轮廓是2,Parent=2;轮廓2没有父轮廓,所以Parent=-1。
OpenCV中找到的轮廓序号跟前面讲的不同

现在既然我们了解了轮廓层级的概念,那么类似cv.RETR_TREE的轮廓寻找方式又是啥意思呢?
轮廓寻找方式
OpenCV中有四种轮廓寻找方式RetrievalModes,下面分别来看下:
1. RETR_LIST
这是最简单的一种寻找方式,它不建立轮廓间的子属关系,也就是所有轮廓都属于同一层级。这样,hierarchy中的后两个值[First Child, Parent]都为-1。比如同样的图,我们使用cv.RETR_LIST来寻找轮廓:
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, 2)
print(hierarchy)
# 结果如下
[[[ 1 -1 -1 -

本文深入探讨了OpenCV中cv.findContours函数的使用方法,详细解析了轮廓检索模式(RetrievalModes)如RETR_TREE、RETR_EXTERNAL、RETR_LIST和RETR_CCOMP的含义及其应用场景,并通过实例演示了如何利用这些模式进行图像轮廓的检测。
最低0.47元/天 解锁文章
3887

被折叠的 条评论
为什么被折叠?



