對于cv2.findContours() 函數,相信很多人都在使用,利用其進行輪廓的尋找,之後利用cnt[num],對第num個輪廓進行操作,但是該函數返回的三個參數具體表示的是什麼呢?
下面就進行詳細介紹,為了能夠使讀者更加深入的理解,利用下面的例程進行具體分析。
準備材料:圖片一張(作者手動畫圖軟件繪制的)
Python程序如下:
- improve cv2
- improve numpy as np
- img=cv2.imread('test.jpg')
- imgray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
- ret,thresh=cv2.thrshold(imgray,127,255,0)
- image,cnts,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
- cv2.imshow('imageshow',image) # 顯示返回值image,其實與輸入參數的thresh原圖沒啥區别
- cv2.waitKey()
- print(np.size(cnts)) # 得到該圖中總的輪廓數量
- print(cnts[0]) # 打印出第一個輪廓的所有點的坐标, 更改此處的0,為0--(總輪廓數-1),可打印出相應輪廓所有點的坐标
- print(hierarchy) #打印出相應輪廓之間的關系
- img=cv2.drawCountours(img,[cnts[0]],-1,(0,255,0),10) #标記處編号為0的輪廓
- cv2.imshow('drawimg',img)
- cv2.waitKey()
- 5 ###說明總輪廓是為5
- [[[272 421]] #編号為0的輪廓的一系列坐标值
- [[270 423]]
- ......
- ......
- [[274 421]]
###各輪廓間關系[[[ 1 -1 -1 -1] #輪廓0
其輸出矩矩陣大小為NXM, 其中N為輪廓的個數,M恒等于4,也就是說每一行的4個數,能夠表示出輪廓間的相互關系,那麼具體是怎樣表示的呢
第一個數:表示同一級輪廓的下個輪廓的編号,如果這一級輪廓沒有下一個輪廓,一般是這一級輪廓的最後一個的時候,則為-1
第二個數:表示同一級輪廓的上個輪廓的編号,如果這一級輪廓沒有上一個輪廓,一般是這一級輪廓的第一個的時候,則為-1
第三個數:表示該輪廓包含的下一級輪廓的第一個的編号,假如沒有,則為-1
第四個數: 表示該輪廓的上一級輪廓的編号,假如沒有上一級,則為-1
廢話不多說,直接上圖,标記處各輪廓間層次關系及編号
具體分析證明:
輪廓0,它的同級下一個的編号為1,第一個參數為1; 因為這一級别的第一個,第二個參數-1;因為不包含子輪廓,所以第三個參數-1;因為處于第一級,其不屬于任何别的級别,所以第四個參數為-1
- [[[ 1 -1 -1 -1] #輪廓0
- [ 4 0 2 -1] #輪廓1
- [-1 -1 3 1] #輪廓2
- [-1 -1 -1 2] #輪廓3
- [-1 1 -1 -1]]] #輪廓4
輪廓1,它的同級下一個的編号為4,第一個參數為4; 因為這一級别的上一個的編号為0,第二個參數0;因為包含子輪廓,且子輪廓的第一個編号(當然隻包含一個,多個也是同樣的道理)為2,所以第三個參數2;因為處于第一級,其不屬于任何别的級别,所以第四個參數為-1
輪廓2,它是第二級的最後一個(因為隻有一個),所以第一個參數為-1; 它也是第二級的第一個,所以第二個參數為-1;因為包含子輪廓,且子輪廓的第一個編号(當然隻包含一個,多個也是同樣的道理)為3,所以第三個參數3; 因為處于第二級,其屬于上一級的輪廓1,所以第四個參數為1
依次類推 。。。。。輪廓3
輪廓4 它是同一級(第一級)的最後一個,因此第一個參數為-1;因為這一級别的上一個的編号為1,第二個參數1;因為不包含子輪廓,所以第三個參數-1;因為處于第一級,其不屬于任何别的級别,所以第四個參數為-1
用最通俗的方法,詳細大家一定能理解吧! 點擊頂哦
有話要說...