OpenCV—Python 輪廓檢測(findContours)
阿新 • • 發佈:2018-12-13
1 獲取輪廓
OpenCV2獲取輪廓主要是用 cv2.findContours()
import cv2
import numpy as np
imgray = cv2.imread('test.jpg',0) # 以灰度圖形式讀入
ret,thresh = cv2.threshold(imgray,127,255,0) # 二值化,設定閾值127(大小影響二值化結果)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
其中,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 近似演算法
2 繪出輪廓
cv2.drawContours()函式 cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset ]]]]])
- 第一個引數是指明在哪幅影象上繪製輪廓;
- 第二個引數是輪廓本身,在Python中是一個list。
- 第三個引數指定繪製輪廓list中的哪條輪廓,如果是-1,則繪製其中的所有輪廓。後面的引數很簡單。其中thickness表明輪廓線的寬度,如果是-1(cv2.FILLED),則為填充模式。繪製引數將在以後獨立詳細介紹。
為了看到自己畫了哪些輪廓,可以使用 cv2.boundingRect()
函式獲取輪廓的範圍,即左上角原點,以及他的高和寬。然後用cv2.rectangle()
方法畫出矩形輪廓
for i in range(0,len(contours)):
x, y, w, h = cv2.boundingRect(contours[i])
cv2.rectangle(image, (x,y), (x+w,y+h), (153,153,0), 5)
3 獲取輪廓區域
new_image=image[y+2:y+h-2,x+2:x+w-2] # 先用y確定高,再用x確定寬
input_dir=("E:/cut_image/")
if not os.path.isdir(input_dir):
os.makedirs(input_dir)
cv2.imwrite( nrootdir+str(i)+".jpg",newimage)
print (i)