我认为您的问题实际上包括两个问题.
第一个问题是提取轮廓,您可以使用findContour函数实现该轮廓:
import numpy as np
print cv2.__version__
rMaskgray = cv2.imread('test.jpg', 0)
(thresh, binRed) = cv2.threshold(rMaskgray, 200, 255, cv2.THRESH_BINARY)
_, Rcontours, hier_r = cv2.findContours(binRed,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)
r_areas = [cv2.contourArea(c) for c in Rcontours]
max_rarea = np.argmax(r_areas)
CntExternalMask = np.ones(binRed.shape[:2], dtype="uint8") * 255
contour= Rcontours[max_rarea]
cv2.drawContours(CntExternalMask,[contour],-1,0,1)
print "These are the contour points:"
print c
print "shape: ", c.shape
for p in contour:
print p[0][0]
cv2.circle(CntExternalMask, (p[0][0], p[0][1]), 5, (0,255,0), -1)
cv2.imwrite("contour.jpg", CntExternalMask)
cv2.imshow("Contour image", CntExternalMask)
cv2.waitKey(0)
如果执行程序,轮廓点将作为点坐标列表打印.
所选择的轮廓逼近方法会影响实际使用的插值(以及找到的点数),如here所述.我在使用逼近方法cv2.CHAIN_APPROX_SIMPLE找到的点处添加了小点.您会看到直线已经近似.
不过,我可能还不太了解您的第二步.您想省略其中一些点,用样条曲线部分替换点列表.可能有不同的方法,具体取决于您的最终意图.您是否只想替换直线?如果要更换弯曲零件,允许的误差范围是多少?