1.什么是层次结构
通常我们使用函数cv2.findContours 在图片中查找一个对象。有时对象
可能位于不同的位置。还有些情况,一个形状在另外一个形状的内部,这种
情况下我们称外部的形状为父,内部的形状为子。按照这种方式分类,一幅图像中的所有轮廓之间就建立父子关系。这样我们就可以确定一个轮廓与其他轮廓是怎样连接的,比如它是不是某个轮廓的子轮廓,或者是父轮廓。这种关系就成为组织结构。![](https://box.kancloud.cn/c4c45c9b9fdaa8027e26ab3754b05051_912x610.jpg)
在这幅图像中,我给这几个形状编号为0-5。2 和2a 分别代表最外边矩形
的外轮廓和内轮廓。
在这里边轮廓0,1,2 在外部或最外边。我们可以称他们为(组织结构)
0 级,简单来说就是他们属于同一级。接下来轮廓2a。我们把它当成轮廓2 的子轮廓。它就成为(组织结构)第1 级。同样轮廓3 是轮廓2 的子轮廓,成为(组织结构)第3 级。最后轮廓4,5 是轮廓3a 的子轮廓,成为(组织结构)4 级(最后一级)。按照这种方式给这些形状编号,我们可以说轮廓4 是轮廓3a 的子轮廓(当然轮廓5 也是)。
2.opencv中层次结构
OpenCV使用一个含有四个元素的数组表示父子关系,【Next,Previous,First_Child,Parent】
Next表示同一级组织结构中的下一个轮廓。
以上图中的轮廓 0 为例轮廓 1 就是他的 Next。同样轮廓 1 的 Next 是 2Next=2。 轮廓 2 呢在同一级没有 Next。时 Next=-1。而轮廓 4 的 Next 为 5所以它的 Next=5。
Previous 示同一级结构中的前一个轮廓。
与前一样轮廓 1 的 Previous 为轮廓 0轮廓 2 的 Previous 为 轮廓 1。轮廓 0 没有 Previous所以 Previous=-1。
First_Child 示它的第一个子轮廓。
没有必再了轮廓 2 的子轮廓为 2a。所以它的 First_Child 为 2a。轮廓 3a 呢它有两个子轮廓。但是我们只第一个子轮廓所以是 轮廓 4按照从上往下从左往右的序排序。
Parent 示它的父轮廓。
与 First_Child 刚好相反。轮廓 4 和 5 的父轮廓是轮廓 3a。而轮廓 3a 的父轮廓是 3。
【如果没有父或子,就为-1】
3.轮廓检索模式
RETR_LIST 从的度来看中应是简单的。它只是提取所有的轮廓而不去创建任何父子关系。换句就是‘’人人平等‘’它们属于同一级组织轮廓。
所以在种情况下组织结构数组的第三和第四个数是 -1。但是很明 显Next 和 Previous 有对应的值。
RETR_EXTERNAL 如果你择种模式的只会回外的的轮廓,所有的子轮廓会忽略掉。