針對遇到的各種複雜形狀的主體,大多情況下,我們可以求得一個近似的多邊形來簡化視覺圖像處理,因為多邊形是由直線組成的,這樣就可以準確的劃分區域來便捷後續的操作。 cv2.arcLength() Method: 參數: curve:要計算周長的輪廓,可以是一個矩形、圓形、多邊形等封閉曲線。 closed ...
針對遇到的各種複雜形狀的主體,大多情況下,我們可以求得一個近似的多邊形來簡化視覺圖像處理,因為多邊形是由直線組成的,這樣就可以準確的劃分區域來便捷後續的操作。
cv2.arcLength() Method:
參數:
curve
:要計算周長的輪廓,可以是一個矩形、圓形、多邊形等封閉曲線。closed
:一個布爾值,表示輪廓是否為封閉曲線。如果closed=True
,則假設輪廓是閉合的;如果closed=False
,則假設輪廓是開放的。
返回值:
retval
:給定輪廓的周長或長度。如果輪廓是一個封閉曲線(如圓形、多邊形等),則retval
表示該曲線的周長;如果輪廓是一條開放曲線(如一條直線),則retval
表示該曲線的長度。
cv2.approxPolyDP() Method:
參數:
curve
:要逼近的輸入輪廓。epsilon
:指定逼近精度的參數,即逼近多邊形與原始曲線之間的最大距離。這個參數決定了逼近的精度,值越小表示逼近得越精確。通常情況下,這個值是一個很小的正數。closed
:一個布爾值,表示逼近多邊形是否是封閉的。如果closed=True
,則表示輸出的逼近多邊形是封閉的,即首尾相連形成一個閉合多邊形;如果closed=False
,則表示輸出的逼近多邊形是開放的。
返回值:
approxCurve
:表示逼近後的多邊形曲線。這是一個新的輪廓,它是對輸入輪廓進行多邊形逼近後得到的結果。
1 import cv2 2 import numpy 3 4 img = cv2.imread('../img/img.png', -1) 5 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) 6 contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 7 8 img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 9 for c in contours: 10 # 計算輪廓的總長的百分之一,作為最大差值 11 epsilon = 0.01 * cv2.arcLength(c, True) 12 # 將輪廓近似為一個多邊形 13 approx = cv2.approxPolyDP(c, epsilon, True) 14 # 獲取輪廓的凸多邊形,並且可以完全包含整個輪廓 15 hull = cv2.convexHull(c) 16 17 # cv2.drawContours(img, [c], -1, (0, 255, 0), 2) 18 cv2.drawContours(img, [approx], -1, (255, 255, 0), 2) 19 cv2.drawContours(img, [hull], -1, (0, 0, 255), 2) 20 21 22 # img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 23 # img = cv2.drawContours(img, contours, -1, (0, 255, 0), 2) 24 cv2.imshow('', img) 25 cv2.waitKey() 26 cv2.destroyAllWindows()
上述代碼中,可以修改 epsilon(ε)參數來獲得不同逼近的多邊形,當 epsilon(ε)越大,則得到的多邊形越簡易,越小則越貼近傳入的輪廓形狀。
運行結果: