如何在 OpenCV 中将边缘转换为轮廓
How to convert from edges to contours in OpenCV
边缘检测后我得到了这样的图像:
我希望它将边连接在一起形成直线多边形。
我认为这可以使用带链近似的 findCountours 来完成,但这对我来说似乎效果不佳。
如何将上面的图像转换为简单的直线多边形(看起来像倾斜的三角形、梯形和正方形)?
您需要先检测线条,然后构建轮廓。您可以使用 HoughLines()
来做到这一点。有个short tutorial here.
模糊图像,然后找到轮廓。
如果边缘靠得很近,可以使用类似
的简单模糊处理
def blur_image(image, amount=3):
'''Blurs the image
Does not affect the original image'''
kernel = np.ones((amount, amount), np.float32) / (amount**2)
return cv2.filter2D(image, -1, kernel)
应该连接所有的小间隙,你可以用它做轮廓检测。
如果您随后想将这些轮廓转换为多边形,您可以将这些轮廓近似为多边形。 here.
是一个很棒的代码教程
检测多边形背后的基本思想是运行
cv2.findContours(image, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
这告诉 OpenCV 用直线逼近轮廓,创建多边形。 (我现在不确定 cv2.RETR_EXTERNAL 参数的作用。)
边缘检测后我得到了这样的图像:
我希望它将边连接在一起形成直线多边形。
我认为这可以使用带链近似的 findCountours 来完成,但这对我来说似乎效果不佳。
如何将上面的图像转换为简单的直线多边形(看起来像倾斜的三角形、梯形和正方形)?
您需要先检测线条,然后构建轮廓。您可以使用 HoughLines()
来做到这一点。有个short tutorial here.
模糊图像,然后找到轮廓。
如果边缘靠得很近,可以使用类似
的简单模糊处理def blur_image(image, amount=3):
'''Blurs the image
Does not affect the original image'''
kernel = np.ones((amount, amount), np.float32) / (amount**2)
return cv2.filter2D(image, -1, kernel)
应该连接所有的小间隙,你可以用它做轮廓检测。
如果您随后想将这些轮廓转换为多边形,您可以将这些轮廓近似为多边形。 here.
是一个很棒的代码教程检测多边形背后的基本思想是运行
cv2.findContours(image, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
这告诉 OpenCV 用直线逼近轮廓,创建多边形。 (我现在不确定 cv2.RETR_EXTERNAL 参数的作用。)