opencv-python:cv.findContours()轮廓的层次结构
原博地址:opencv-python轮廓的层次结构
1.层级结构:
通常使用cv.findContours()函数来检测图像中的轮廓对象,常有某些轮廓在其他轮廓的内部呈现嵌套的关系,在这种情况下将外部轮廓称为父项,将内部轮廓称为子项,这种关系的表示称为层次结构。
如下图所示,轮廓0/1/2是外部或最外部的,它们处于相同的层次结构级别,处于层级结构0中;
轮廓2a可以被认为是轮廓2的子节点,也就是轮廓2是轮廓2a的父节点,所以它处于层次结构1中;
类似地,轮廓3是轮廓4 的子节点,它属于下一层次结构;
最后,轮廓4/5是轮廓3a的子节点,它们位于最后的层次结构级别。OpenCV中的层次结构表示
2.OpenCV中的层次结构表示 :
每个轮廓都有自己的信息,包括轮廓的层次结构/子轮廓/父轮廓等,OpenCV将它表示为四个值的数组:[Next,Previous,First_Child,Parent]。
1)Next:
当前轮廓同一层级的下一个轮廓。
在上图中获取contour0.Next = 1;Contour1.Next = 2;Contour2.Next = -1(由于同一级别没有下一个轮廓)。
2)Previous:
当前轮廓同一层级的上一个轮廓。
在上图中获取Contour1.Previous= 0;Contour0.Previous= -1(由于同一级别没有上一个轮廓)。
3)First_Child:
当前轮廓的第一个子轮廓。
Contour2.Previous= 2a;
4)Parent:
当前轮廓父轮廓的索引.
与First_Child相反, 对于轮廓4和轮廓5,父轮廓都是轮廓3a,如果没有子项或父项,则返回-1。
3.轮廓检索模式:
1)RETR_LIST:
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]]])
RETR_EXTERNAL模式仅返回最外层的轮廓,忽略所有子轮廓。
>>> hierarchy
array([[[ 1, -1, -1, -1],
[ 2, 0, -1, -1],
[-1, 1, -1, -1]]])
3)RETR_CCOMP:
RETR_CCOMP模式检索所有轮廓并将它们排列为2级层次结构,用1或2标记轮廓的顺序和它们所属的层次结构:
a.对象的外部轮廓(即其边界)属于层次结构1;
b.对象内部的孔的轮廓属于层次结构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_CCOMP:
RETR_CCOMP模式检索所有轮廓并创建完整的层次结构列表。
>>> 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]]])