相比C++而言,Python適合做原型。本系列的文章介紹如何在Python中用OpenCV圖形庫,以及與C++調用相應OpenCV函數的不同之處。這篇文章介紹在Python中使用OpenCV檢測并繪制輪廓。
提示:
轉載請詳細注明原作者及出處,謝謝!
本文介紹在OpenCV-Python中檢測并繪制輪廓的方法。
本文不介詳細的理論知識,讀者可從其他資料中獲取相應的背景知識。筆者推薦清華大學出版社的《圖像處理與計算機視覺算法及應用(第2版)》。
輪廓檢測
輪廓檢測也是圖像處理中經常用到的。OpenCV-Python接口中使用cv2.findContours()函數來查找檢測物體的輪廓。
實現
使用方式如下:
import cv2 img = cv2.imread('D://test//contour.jpg') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY) contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(img,contours,-1,(0,0,255),3) cv2.imshow("img", img) cv2.waitKey(0) 需要注意的是cv2.findContours()函數接受的參數為二值圖,即黑白的(不是灰度圖),所以讀取的圖像要先轉成灰度的,再轉成二值圖,參見4、5兩行。第六行是檢測輪廓,第七行是繪制輪廓。
結果
原圖如下:

檢測結果如下:

注意,findcontours函數會“原地”修改輸入的圖像。這一點可通過下面的語句驗證:
cv2.imshow("binary", binary) contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) cv2.imshow("binary2", binary) 執行這些語句后會發現原圖被修改了。
cv2.findContours()函數
函數的原型為
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
返回兩個值:contours:hierarchy。
參數
第一個參數是尋找輪廓的圖像;
第二個參數表示輪廓的檢索模式,有四種(本文介紹的都是新的cv2接口):
cv2.RETR_EXTERNAL表示只檢測外輪廓
cv2.RETR_LIST檢測的輪廓不建立等級關系
cv2.RETR_CCOMP建立兩個等級的輪廓,上面的一層為外邊界,里面的一層為內孔的邊界信息。如果內孔內還有一個連通物體,這個物體的邊界也在頂層。
cv2.RETR_TREE建立一個等級樹結構的輪廓。
第三個參數method為輪廓的近似辦法
cv2.CHAIN_APPROX_NONE存儲所有的輪廓點,相鄰的兩個點的像素位置差不超過1,即max(abs(x1-x2),abs(y2-y1))==1
新聞熱點
疑難解答