opencv python 轮廓的层次结构
1 层次结构
通常我们使用cv.findContours()函数来检测图像中的对象,有时对象位于不同的位置. 但在某些情况下,某些形状在其他形状内. 就像嵌套的数字一样. 在这种情况下,我们将外部一个称为父项,将内部项称为子项.这种关系的表示称为层次结构.
在这张图片中,从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标记了轮廓的顺序和它们所属的层次结构
>>> 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
它检索所有轮廓并创建完整的族层次结构列表。 它甚至告诉,谁是爷爷,父亲,儿子,孙子
>>> 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]]])