一、返回值概述
cv2.findcontours函數用於檢測二值圖像中的輪廓。這個函數返回三個參數,分別是:
image, contours, hierarchy = cv2.findContours(image, mode, method)
其中,image是輸入的二值圖像;contours是一個列表,其中包含檢測出來的輪廓;hierarchy描述了輪廓之間的關係。
二、contours參數詳解
上面提到,contours是一個列表,其中包含檢測出來的輪廓。每一個輪廓都是由一系列點組成的,可以使用cv2.drawContours函數將其畫出。但是在實際應用中,我們還需要進一步了解這個contours參數。
首先,我們可以通過len(contours)來獲取圖像中的輪廓數量,也可以使用cv2.drawContours函數畫出指定的輪廓。假設我們想要畫出第二個輪廓,代碼如下:
cv2.drawContours(img, [contours[1]], -1, (0,255,0), 3)
如果想要獲取第一個輪廓的面積,可以使用cv2.contourArea函數。同理,我們還可以獲取輪廓的周長(cv2.arcLength)、邊界矩形(cv2.boundingRect)、最小閉合圓(cv2.minEnclosingCircle)等信息。
三、hierarchy參數詳解
在返回值中,hierarchy描述了輪廓之間的關係。hierarchy是一個形狀和contours一樣的多維數組,每一行的元素有四個分量,分別表示後一個輪廓、前一個輪廓、父輪廓和內部輪廓。如果當前輪廓沒有對應的後一個、前一個、父輪廓或內部輪廓,那麼對應分量的值為-1。
對於複雜的輪廓,在使用cv2.drawContours函數時,我們可以通過注釋掉一部分代碼,只畫出特定的輪廓。如果想畫出所有的輪廓,可以使用以下代碼:
cv2.drawContours(img, contours, -1, (0,255,0), 3)
如果想提取某一個輪廓的所有子輪廓,可以使用hierarchy參數。以下是獲取第一個輪廓的子輪廓的示例代碼:
child_ids = hierarchy[0,:,2]
child_contours = [contours[i] for i in child_ids if i != -1]
四、輪廓近似
cv2.findContours返回的輪廓是由一系列點組成的,但是實際應用中,我們往往需要將輪廓進行近似,以便用更少的點來表示輪廓。這個近似過程可以通過cv2.approxPolyDP實現,它需要兩個參數:輸入的輪廓和近似程度(epsilon)。近似的結果是一系列點,可以使用cv2.drawContours函數將其畫出。
以下是進行近似的示例代碼:
epsilon = 0.01 * cv2.arcLength(contours[0], True)
approx = cv2.approxPolyDP(contours[0], epsilon, True)
cv2.drawContours(img, [approx], -1, (0, 0, 255), 3)
五、輪廓特徵提取
在檢測輪廓時,如果我們想要進行輪廓匹配或者分類,那麼需要從輪廓中提取一些特徵。常見的特徵包括:輪廓面積、周長、重心、邊界框、外接圓、最大直徑等。以下是獲取輪廓面積和周長的示例代碼:
area = cv2.contourArea(contours[0])
perimeter = cv2.arcLength(contours[0], True)
需要注意的是,這些特徵提取函數都需要傳入輪廓作為參數。
六、小結
本文深入探究了cv2.findContours函數返回值中的contours和hierarchy參數,並且介紹了輪廓近似和輪廓特徵提取。通過這些知識點,我們可以更好地理解輪廓檢測的原理,並且在實際應用中更加靈活地使用輪廓。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/185313.html