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 )
原图及三个结果图: