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]]])