當前位置:首頁 > 科技 > 正文

(2條消息)cv2.findContours()返回函數詳解, findContours()

對于cv2.findContours() 函數,相信很多人都在使用,利用其進行輪廓的尋找,之後利用cnt[num],對第num個輪廓進行操作,但是該函數返回的三個參數具體表示的是什麼呢?

下面就進行詳細介紹,為了能夠使讀者更加深入的理解,利用下面的例程進行具體分析。

準備材料:圖片一張(作者手動畫圖軟件繪制的)

Python程序如下:

     
  
  1. improve cv2
  2. improve numpy as np
  3. img=cv2.imread('test.jpg')
  4. imgray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  5. ret,thresh=cv2.thrshold(imgray,127,255,0)
  6. image,cnts,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
  7. cv2.imshow('imageshow',image) # 顯示返回值image,其實與輸入參數的thresh原圖沒啥區别
  8. cv2.waitKey()
  9. print(np.size(cnts)) # 得到該圖中總的輪廓數量
  10. print(cnts[0]) # 打印出第一個輪廓的所有點的坐标, 更改此處的0,為0--(總輪廓數-1),可打印出相應輪廓所有點的坐标
  11. print(hierarchy) #打印出相應輪廓之間的關系
  12. img=cv2.drawCountours(img,[cnts[0]],-1,(0,255,0),10) #标記處編号為0的輪廓
  13. cv2.imshow('drawimg',img)
  14. cv2.waitKey()

輸出結果為:
     
  
  1. 5 ###說明總輪廓是為5
  2. [[[272 421]] #編号為0的輪廓的一系列坐标值
  3. [[270 423]]
  4. ......
  5. ......
  6. [[274 421]]
###各輪廓間關系
[[[ 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


 

下面具體解釋下hierarchy輸出的矩陣參數的意義

其輸出矩矩陣大小為NXM, 其中N為輪廓的個數,M恒等于4,也就是說每一行的4個數,能夠表示出輪廓間的相互關系,那麼具體是怎樣表示的呢

第一個數:表示同一級輪廓的下個輪廓的編号,如果這一級輪廓沒有下一個輪廓,一般是這一級輪廓的最後一個的時候,則為-1

第二個數:表示同一級輪廓的上個輪廓的編号,如果這一級輪廓沒有上一個輪廓,一般是這一級輪廓的第一個的時候,則為-1

第三個數:表示該輪廓包含的下一級輪廓的第一個的編号,假如沒有,則為-1

第四個數: 表示該輪廓的上一級輪廓的編号,假如沒有上一級,則為-1

廢話不多說,直接上圖,标記處各輪廓間層次關系及編号

具體分析證明:

     
  
  1. [[[ 1 -1 -1 -1] #輪廓0
  2. [ 4 0 2 -1] #輪廓1
  3. [-1 -1 3 1] #輪廓2
  4. [-1 -1 -1 2] #輪廓3
  5. [-1 1 -1 -1]]] #輪廓4
輪廓0,它的同級下一個的編号為1,第一個參數為1; 因為這一級别的第一個,第二個參數-1;因為不包含子輪廓,所以第三個參數-1;因為處于第一級,其不屬于任何别的級别,所以第四個參數為-1

輪廓1,它的同級下一個的編号為4,第一個參數為4; 因為這一級别的上一個的編号為0,第二個參數0;因為包含子輪廓,且子輪廓的第一個編号(當然隻包含一個,多個也是同樣的道理)為2,所以第三個參數2;因為處于第一級,其不屬于任何别的級别,所以第四個參數為-1

輪廓2,它是第二級的最後一個(因為隻有一個),所以第一個參數為-1; 它也是第二級的第一個,所以第二個參數為-1;因為包含子輪廓,且子輪廓的第一個編号(當然隻包含一個,多個也是同樣的道理)為3,所以第三個參數3; 因為處于第二級,其屬于上一級的輪廓1,所以第四個參數為1

依次類推 。。。。。輪廓3

輪廓4 它是同一級(第一級)的最後一個,因此第一個參數為-1;因為這一級别的上一個的編号為1,第二個參數1;因為不包含子輪廓,所以第三個參數-1;因為處于第一級,其不屬于任何别的級别,所以第四個參數為-1

用最通俗的方法,詳細大家一定能理解吧! 點擊頂哦

你可能想看:

有話要說...

取消
掃碼支持 支付碼