示例代碼:
image,contours,hierarchy = cv2.findContours(contour,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
輸入:
contour:帶有輪廓信息的圖像;
cv2.RETR_TREE:提取輪廓後,輸出輪廓信息的組織形式,除了cv2.RETR_TREE還有以下幾種選項:
cv2.RETR_EXTERNAL:輸出輪廓中只有外側輪廓信息;
cv2.RETR_LIST:以列表形式輸出輪廓信息,各輪廓之間無等級關係;
cv2.RETR_CCOMP:輸出兩層輪廓信息,即內外兩個邊界(下面將會說到contours的數據結構);
cv2.RETR_TREE:以樹形結構輸出輪廓信息。
cv2.CHAIN_APPROX_SIMPLE:指定輪廓的近似辦法,有以下選項:
cv2.CHAIN_APPROX_NONE:存儲輪廓所有點的信息,相鄰兩個輪廓點在圖象上也是相鄰的;
cv2.CHAIN_APPROX_SIMPLE:壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點座標;
cv2.CHAIN_APPROX_TC89_L1:使用teh-Chinl chain 近似算法保存輪廓信息。
輸出:
python3裏返回三個值:image,contours,hierarchy
image:可能是跟輸入contour類似的一張二值圖;
contours:list結構,list中每個元素都是圖像中的一個輪廓,用numpy中的ndarray表示,每個輪廓是一個ndarray,每個ndarray是輪廓上的點的集合,列表中每個元素代表一個邊沿信息。每個元素是(x,1,2)的三維向量,x表示該條邊沿裏共有多少個像素點,第三維的那個“2”表示每個點的橫、縱座標;
注意:如果輸入選擇cv2.CHAIN_APPROX_SIMPLE,則contours中一個list元素所包含的x點之間應該用直線連接起來,這個可以用cv2.drawContours()函數觀察一下效果。
hierarchy:返回類型是(x,4)的二維ndarray。其中的元素個數和輪廓個數相同,每個輪廓contours[i]對應4個hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分別對應下一個輪廓編號、上一個輪廓編號、父輪廓編號、子輪廓編號,該值爲負數表示沒有對應項。x和contours裏的x是一樣的意思。如果輸入選擇cv2.RETR_TREE,則以樹形結構組織輸出,hierarchy的四列