1. 程式人生 > >OpenCV—Python 輪廓檢測(findContours)

OpenCV—Python 輪廓檢測(findContours)

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)