opencv-python:cv.findContours()輪廓的層次結構【轉載整理】

opencv-python:cv.findContours()輪廓的層次結構

原博地址:opencv-python輪廓的層次結構

1.層級結構:

         通常使用cv.findContours()函數來檢測圖像中的輪廓對象,常有某些輪廓在其他輪廓的內部呈現嵌套的關係,在這種情況下將外部輪廓稱爲父項,將內部輪廓稱爲子項,這種關係的表示稱爲層次結構。

         如下圖所示,輪廓0/1/2是外部或最外部的,它們處於相同的層次結構級別,處於層級結構0中;
         輪廓2a可以被認爲是輪廓2的子節點,也就是輪廓2是輪廓2a的父節點,所以它處於層次結構1中;
         類似地,輪廓3是輪廓4 的子節點,它屬於下一層次結構;
         最後,輪廓4/5是輪廓3a的子節點,它們位於最後的層次結構級別。OpenCV中的層次結構表示

clipboard.png

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

         2)RETR_EXTERNAL:

              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。

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_CCOMP: 

         RETR_CCOMP模式檢索所有輪廓並創建完整的層次結構列表。

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

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章