1. 程式人生 > >Python opencv2和opencv3中的cv2.findContours函式使用

Python opencv2和opencv3中的cv2.findContours函式使用

接著上一個部落格:關於 Python opencv 使用中的 ValueError: too many values to unpack(http://blog.csdn.net/caicai2526/article/details/79627370)介紹cv2.findContours函式在opencv2和opencv3中區別以及應用。

cv2.findContours函式是一個影象輪廓的繪製方法,進行輪廓的檢測

Opencv2 cv2.findContours 輪廓檢測

這個函式在影象處理裡面是經常應用到的,記住處理的影象是二值影象。

程式碼實現

    import cv2  

    img = cv2.imread('需要處理的影象')  
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(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
cv2.CHAIN_APPROX_SIMPLE壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點座標,例如一個矩形輪廓只需4個點來儲存輪廓資訊
cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似演算法

cv2.findContours()函式返回兩個值,一個是輪廓本身,還有一個是每條輪廓對應的屬性。

Opencv3 cv2.findContours 輪廓檢測

improve cv2  
improve numpy as np  
img=cv2.imread('test.jpg')  
imgray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
ret,thresh=cv2.thrshold(imgray,127,255,0)  
image,cnts,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)  
cv2.imshow('imageshow',image)  # **顯示返回值image,其實與輸入引數的thresh原圖沒啥區別**  
cv2.waitKey()  
print(np.size(cnts))  #   **得到該圖中總的輪廓數量**  
print(cnts[0])   #  打印出第一個輪廓的所有點的座標, 更改此處的0,為0--(總輪廓數-1),可打印出相應輪廓所有點的座標  
print(hierarchy) #**打印出相應輪廓之間的關係**  
img=cv2.drawCountours(img,[cnts[0]],-1,(0,255,0),10)  #標記處編號為0的輪廓  
cv2.imshow('drawimg',img)  
cv2.waitKey() 

與opencv2不同的就是輸出的引數發生變化,這是要注意的。
還有一個函式:OpenCV的cv2.drawContours在影象上繪製輪廓。