TShopping

 找回密碼
 註冊
搜索
查看: 168|回復: 0

[教學] OpenCV findContours 與 drawContours 用法

[複製鏈接]
發表於 2021-4-6 22:08:02 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk  
一、獲取輪廓--findContours
cv2.findContours() 的第二個引數主要有
  • cv2.RETR_LIST:檢測的輪廓不建立等級關係
  • cv2.RETR_TREE:L建立一個等級樹結構的輪廓。
  • cv2.RETR_CCOMP:建立兩個等級的輪廓,上面的一層為外邊界,裡面的一層為內孔的邊界資訊。
  • cv2.RETR_EXTERNAL:表示只檢測外輪廓

cv2.findContours() 的第三個引數 method為輪廓的近似辦法
  • cv2.CHAIN_APPROX_NONE儲存所有的輪廓點,相鄰的兩個點的畫素位置差不超過1,即max(abs(x1-x2),abs(y2-y1))==1
  • cv2.CHAIN_APPROX_SIMPLE壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點座標,例如一個矩形輪廓只需4個點來儲存輪廓資訊
  • cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似演算法

返回值:image, contours, hierarchy
  • contour返回值
    cv2.findContours()函式首先返回一個list,list中每個元素都是影像中的一個輪廓,用numpy中的ndarray表示。
  • hierarchy返回值
    該函式還可返回一個可選的hiararchy結果,這是一個ndarray,其中的元素個數和輪廓個數相同,每個輪廓contours對應4個hierarchy元素hierarchy[0] ~hierarchy[3],分別表示後一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號,如果沒有對應項,則該值為負數。

二、繪出輪廓--drawContours
cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset ]]]]])
  • 第一個引數是指明在哪幅影像上繪製輪廓;
  • 第二個引數是輪廓本身,在Python中是一個list。
  • 第三個引數指定繪製輪廓list中的哪條輪廓,如果是-1,則繪製其中的所有輪廓。後面的引數很簡單。其中thickness表明輪廓線的寬度,如果是-1(cv2.FILLED),則為填充模式。繪製引數將在以後獨立詳細介紹。

三、測試
  1. import cv2

  2. img = cv2.imread('test.png')
  3. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  4. ret,binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

  5. _,contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

  6. draw_img0 = cv2.drawContours(img.copy(),contours,0,(0,255,255),3)
  7. draw_img1 = cv2.drawContours(img.copy(),contours,1,(255,0,255),3)
  8. draw_img2 = cv2.drawContours(img.copy(),contours,2,(255,255,0),3)
  9. draw_img3 = cv2.drawContours(img.copy(), contours, -1, (0, 0, 255), 3)


  10. print ("contours:型別:",type(contours))
  11. print ("第0 個contours:",type(contours[0]))
  12. print ("contours 數量:",len(contours))

  13. print ("contours[0]點的個數:",len(contours[0]))
  14. print ("contours[1]點的個數:",len(contours[1]))

  15. cv2.imshow("img", img)
  16. cv2.imshow("draw_img0", draw_img0)
  17. cv2.imshow("draw_img1", draw_img1)
  18. cv2.imshow("draw_img2", draw_img2)
  19. cv2.imshow("draw_img3", draw_img3)

  20. cv2.waitKey(0)
  21. cv2.destroyAllWindows()

  22. #################################
  23. # 輸出:
  24. # contours:型別: <class 'list'>
  25. # 第0 個contours: <class 'numpy.ndarray'>
  26. # contours 數量: 3
  27. # contours[0]點的個數: 6
  28. # contours[1]點的個數: 74
複製代碼

OpenCV findContours drawContours Python

OpenCV findContours  drawContours Python


文章出處

 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2021-4-18 09:20 , Processed in 0.085801 second(s), 24 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表