一、檢測輪廓
輪廓檢測是圖像處理中常常用到的,OpenCV-Python接口中使用cv2.findContours()函數查找檢測物體的輪廓。算法
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
返回兩個值:contours(輪廓自己),hierarchy(每條輪廓對應的屬性)函數
參數:spa
- image:尋找輪廓的圖像
- mode:輪廓的檢索模式:
cv2.RETR_EXTERNAL表示只檢測外輪廓 cv2.RETR_LIST檢測的輪廓不創建等級關係,cv2.RETR_CCOMP創建兩個等級的輪廓,上面的一層爲外邊界,裏面的一層爲內孔的邊界信息。若是內孔內還有一個連通物體,這個物體的邊界也在頂層。cv2.RETR_TREE創建一個等級樹結構的輪廓。code
- method:輪廓的近似方法。
cv2.CHAIN_APPROX_NONE存儲全部的輪廓點,相鄰的兩個點的像素位置差不超過1,即max(abs(x1-x2), abs(y1-y2))=1。 cv2.CHAIN_APPROX_SIMPLE壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點座標,例如一個矩陣輪廓只需4個點來保存輪廓信息。 cv2.CHAIN_APPROX_TC89_L1, cv2.CHAIN_APPROX_TC89_KCOS使用teh-Chini chain近似算法
blog
二、繪製輪廓
cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[,maxLevel[, offset ]]]]])
參數:接口
- image:傳入要繪製輪廓的背景圖片
- contours:輪廓自己
- contourIdx:指定繪製輪廓中的那條輪廓,若是是-1,則繪製其中的全部輪廓。thickness表示的是輪廓的寬度,若是是-1(cv2.FILLED),表示爲填充模式。
三、代碼實現
import numpy as np import cv2 # 輪廓檢測 img = cv2.imread('dog.jpg') # 獲取灰度圖 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 利用閾值自動選擇的方法獲取二值圖像 ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU) # 檢測輪廓 contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 繪製輪廓 cv2.drawContours(img, contours, -1, (0, 255, 0), 1) cv2.imshow('gray', gray) cv2.imshow('res', img) cv2.waitKey(0) cv2.destroyAllWindows()