1.什么是層次結構
通常我們使用函數cv2.findContours 在圖片中查找一個對象。有時對象
可能位于不同的位置。還有些情況,一個形狀在另外一個形狀的內部,這種
情況下我們稱外部的形狀為父,內部的形狀為子。按照這種方式分類,一幅圖像中的所有輪廓之間就建立父子關系。這樣我們就可以確定一個輪廓與其他輪廓是怎樣連接的,比如它是不是某個輪廓的子輪廓,或者是父輪廓。這種關系就成為組織結構。
在這幅圖像中,我給這幾個形狀編號為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 如果你擇種模式的只會回外的的輪廓,所有的子輪廓會忽略掉。