在打算自己實現二維碼的定位的時候,看到了相關博文的關於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模式的輪廓索引(編號)理解就到位了。