Contours Hierarchy

1 层次结构

通常我们使用cv.findContours()函数来检测图像中的对象,有时对象位于不同的位置. 但在某些情况下,某些形状在其他形状内. 就像嵌套的数字一样. 在这种情况下,我们将外部一个称为父项,将内部项称为子项.这种关系的表示称为层次结构.

clipboard.png
在这张图片中,从0-5编号, 2和2a表示最外侧盒子的外部和内部轮廓.
轮廓-0,1,2是外部或最外部的. 我们可以说,它们在层次结构-0中,或者只是它们处于相同的层次结构级别.
轮廓-2a可以被认为是轮廓-2的子节点(或者相反,轮廓-2是轮廓-2a的父节点),所以让它在层次结构-1中.
类似地,轮廓-3是轮廓-2的子节点,它进入下一层次。
最后,轮廓-4,5是轮廓-3a的子节点,它们位于最后的层次结构级别。

2 OpenCV中的层次结构表示

每个轮廓都有自己的信息,关于它是什么层次结构,谁是它的子,谁是它的父等.OpenCV将它表示为四个值的数组:[Next,Previous,First_Child,Parent]

  • Next:同一层级的下一个轮廓
    在我们的图片中取出contour-0,Next = 1;
    Contour-1,Next = 2;
    Contour-2,同一级别没有下一个轮廓,Next = -1.
  • Previous:同一层级的前轮廓
    Contour-1,Previous= 0;
    Contour-0,同一级别没有上一个轮廓,Previous= -1
  • First_Child:其第一个子轮廓.
    Contour-2,Previous= 2a;
  • Parent:其父轮廓的索引.
    与First_Child相反, 对于轮廓-4和轮廓-5,父轮廓都是轮廓-3a,如果没有子项或父项,则该字段将被视为-1

3 轮廓检索模式

连接章节

1 RETR_LIST

只是检索所有轮廓,但不创建任何父子关系, 根据这条规则,父母和孩子是平等的,他们只是轮廓, 即它们都属于同一层次结构.

>>> hierarchy
array([[[ 1, -1, -1, -1],
        [ 2,  0, -1, -1],
        [ 3,  1, -1, -1],
        [ 4,  2, -1, -1],
        [ 5,  3, -1, -1],
        [ 6,  4, -1, -1],
        [ 7,  5, -1, -1],
        [-1,  6, -1, -1]]])

2 RETR_EXTERNAL

如果使用此标志,则仅返回最外的轮廓。 所有子轮廓都被遗忘. 我们可以说,根据这项规则,只有每个家庭中最年长的人才能得到照顾, 它并不关心其他家庭成员.

>>> hierarchy
array([[[ 1, -1, -1, -1],
        [ 2,  0, -1, -1],
        [-1,  1, -1, -1]]])

3 RETR_CCOMP

此标志检索所有轮廓并将它们排列为2级层次结构。 即对象的外部轮廓(即其边界)放置在层次结构-1中. 对象内部的孔的轮廓(如果有的话)放在层次结构-2中.

用1或2标记了轮廓的顺序和它们所属的层次结构
clipboard.png

>>> hierarchy
array([[[ 3, -1,  1, -1],
        [ 2, -1, -1,  0],
        [-1,  1, -1,  0],
        [ 5,  0,  4, -1],
        [-1, -1, -1,  3],
        [ 7,  3,  6, -1],
        [-1, -1, -1,  5],
        [ 8,  5, -1, -1],
        [-1,  7, -1, -1]]])

4 RETR_TREE

它检索所有轮廓并创建完整的族层次结构列表。 它甚至告诉,谁是爷爷,父亲,儿子,孙子
clipboard.png

>>> hierarchy
array([[[ 7, -1,  1, -1],
        [-1, -1,  2,  0],
        [-1, -1,  3,  1],
        [-1, -1,  4,  2],
        [-1, -1,  5,  3],
        [ 6, -1, -1,  4],
        [-1,  5, -1,  4],
        [ 8,  0, -1, -1],
        [-1,  7, -1, -1]]])

sakurala
84 声望37 粉丝

目前正在学习以及巩固opencv-python知识.