【Python】【OpenCV】關於cv2.findContours()輪廓索引(編號)解析(RETR_TREE)

VanGoghpeng發表於2023-12-26

  在打算自己實現二維碼的定位的時候,看到了相關博文的關於cv2.findContours返回的層級資訊來定位三個“回”字從而達到定位二維碼的目的,但是返回的hierarchy中的層級資訊分別對應的是哪個輪廓卻困擾了許久,查閱了很多資料最後還是自己手動找出了清晰的規律。

  關於hierarchy返回的每一組list中的每個元素的意義分別是:

    1、Next 表示相同等級的下一個輪廓。

    2、Previous 表示相同輪廓級別的上一個輪廓。

    3、First_Child 表示其第一個子輪廓。

    4、Parent 代表示其父代輪廓的索引。

  具體的描述我就不過多贅述了,相關資料可以跳轉參考 -> OpenCV-Python輪廓層次結構|極客筆記 (deepinout.com)

 

  這裡只介紹針對同一層級的輪廓序號是如何命名,先給出結論,在同一層級中(可以看作是一個座標系xy),垂直方向 > 水平方向 (即,先找尋y軸,當y軸相同時再找尋x軸),哪個輪廓離原點(0,0)更遠就會被優先檢測到,並優先命名編號

 

上程式碼:

 1、先自己建立了一個array陣列並初始化為0(也就是都是黑色)

 2、繪製三個區域,大小為50x50的正方形,並置為白色

 3、pretreatment是個函式,自行修改成cv2.findContours()然後再cv2.drawContours()即可,這邊就懶得改了~

 上圖展示了我們繪製的三個白塊,並對他們的輪廓進行了繪製,接下來我們依次查詢index為0的輪廓。

 

1、當水平方向位移量不同垂直方向位移量相同,右方的白塊會被優先檢測到,我們繪製出index為0的輪廓(綠色):

 

2、當水平方向位移量相同垂直方向位移量不同時,下方的白塊會被優先檢測到:

 

3、當水平方向位移不同垂直方向位移不同時,先找y軸:

 

最後我們顯示四個白塊,並將hierarchy資料展示出來:

 根據之前的檢測順序,我已經標出了從0~3這四個輪廓的編號,下面我們先自己寫出每個輪廓的hierarchy:

[1, -1, -1, -1]、[2, 0, -1, -1]、[3, 1, -1, -1]、[-1, 2, -1, -1]

 和程式中得到的hierarchy結果相同,至此關於RETR_TREE模式的輪廓索引(編號)理解就到位了。

相關文章