Python-opencv 筆記6 – 輪廓(Contours)
1、查找輪廓 findContours
函數原型
image, contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
參數:
- image:8位單通道二值圖,如果爲灰度圖非0值爲1
- mode:輪廓的檢索模式
- 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
- cv2.CHAIN_APPROX_SIMPLE:壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點座標,例如一個矩形輪廓只需4個點來保存輪廓信息
- cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
返回值:
- image:被處理的圖片,正常沒用
- contours:numpy的ndarray,每個元素都是圖像中的一個輪廓,每個元素包括多個點
- hierarchy:numpy的ndarray,元素個數和輪廓個數相同,輪廓 contours[i] 對應於hierarchy[i],每個 hierarchy 元素包括四個元素 hierarchy[i][0] ~ hierarchy[i][3],分別表示後一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號,如果沒有對應項,則該值爲負數。
# 實例
img = cv2.imread('1.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)
2、繪製輪廓 findContours
函數原型
cv.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])
參數:
- image:輸入圖像
- contours:輪廓,一個輪廓2個點的維數爲(1,1,2,1,2)
- contourIdx:繪製contours中的哪條輪廓,如果是-1,則繪製其中的所有輪廓
- color:繪製的輪廓的顏色
- thickness:輪廓線的寬度,如果是 -1(cv2.FILLED),則爲填充模式
# 實例
cv2.drawContours(img,contours,-1,(0,0,255),3)
cv2.imshow("img", img)
cv2.waitKey(0)