approx = cv2.approxPolyDP(contour,epsilon,True) 採用Douglas-Peucker算法,可參考:https://blog.csdn.net/foreverling/article/details/78066632
第一個參數是輪廓的點集。
第二個參數epsilon的含義如下所述,濾掉的線段集離新產生的線段集的距離爲d,若d小於epsilon,則濾掉,否則保留。
第三個參數指示新產生的輪廓是否閉合。
返回的是一些列點組成的多邊形。
下面是設定不同epsilon得到不同近似多邊形的例子代碼:
import cv2
import numpy as np
img = cv2.imread('rect.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(img_gray, 127, 255,0)
_,contours,_ = cv2.findContours(thresh,cv2.RETR_EXTERNAL , cv2.CHAIN_APPROX_SIMPLE )
print('len:',len(contours) )
print(type(contours[0]) , contours[0] )
cv2.circle( img ,(contours[0][0][0][0],contours[0][0][0][1]) , 5 , (0, 0, 255), 2 )
cord=str( contours[0][0][0][0]) + ',' + str(contours[0][0][0][1])
cv2.putText(img, cord , (contours[0][0][0][0]-120,contours[0][0][0][1]), cv2.FONT_HERSHEY_COMPLEX, 1.0, (0, 0, 255), 2 )
cv2.circle( img ,(contours[0][1][0][0],contours[0][1][0][1]) , 5 , (0, 0,255), 2 )
cord=str( contours[0][1][0][0]) + ',' + str(contours[0][1][0][1])
cv2.putText(img, cord , (contours[0][1][0][0],contours[0][1][0][1]+32), cv2.FONT_HERSHEY_COMPLEX, 1.0, (0, 0, 255), 2 )
x1 = img.copy()
epsilon = 50
approx = cv2.approxPolyDP(contours[0],epsilon,True)
cv2.polylines(x1, [approx], True, (0, 0, 255), 2)
cv2.putText(x1, "epsilon:50" , (160,180), cv2.FONT_HERSHEY_COMPLEX, 1.0, (0, 0, 255), 2 )
cv2.imwrite( 'approxcurve1.jpg' , x1 )
x1 = img.copy()
epsilon = 30
approx = cv2.approxPolyDP(contours[0],epsilon,True)
cv2.polylines(x1, [approx], True, (255, 0, 0), 2)
cv2.putText(x1, "epsilon:30" , (160,180), cv2.FONT_HERSHEY_COMPLEX, 1.0, (0, 0, 255), 2 )
cv2.imwrite( 'approxcurve2.jpg' , x1 )
x1 = img.copy()
epsilon = 35
approx = cv2.approxPolyDP(contours[0],epsilon,True)
cv2.polylines(x1, [approx], True, (0, 255, 0), 2)
cv2.putText(x1, "epsilon:35" , (160,180), cv2.FONT_HERSHEY_COMPLEX, 1.0, (0, 0, 255), 2 )
cv2.imwrite( 'approxcurve3.jpg' , x1 )
原圖及三個結果圖: