Python 如何在OpenCV中从边转换为轮廓

Python 如何在OpenCV中从边转换为轮廓,python,opencv,edge-detection,opencv-contour,Python,Opencv,Edge Detection,Opencv Contour,在边缘检测后,我得到了如下图像: 我想把边连接成直线多边形 我认为这可以通过使用FindCountors和链近似来实现,但这对我来说似乎不太合适 如何将上述图像转换为简单的直线多边形(看起来像倾斜的三角形、梯形和正方形)?您需要首先检测直线,然后构建轮廓。您可以使用HoughLines()来执行此操作。有一个。模糊图像,然后找到轮廓 如果边缘靠得很近,则使用类似 def blur_image(image, amount=3): '''Blurs the image Does n

在边缘检测后,我得到了如下图像:

我想把边连接成直线多边形

我认为这可以通过使用FindCountors和链近似来实现,但这对我来说似乎不太合适


如何将上述图像转换为简单的直线多边形(看起来像倾斜的三角形、梯形和正方形)?

您需要首先检测直线,然后构建轮廓。您可以使用
HoughLines()
来执行此操作。有一个。

模糊图像,然后找到轮廓

如果边缘靠得很近,则使用类似

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)
应该连接所有的小间隙,你可以用它做轮廓检测

如果要将这些轮廓转换为多边形,可以将这些轮廓近似为多边形。这是一个很好的教程,其中包含了这方面的代码

检测多边形背后的基本思想是运行

cv2.findContours(image, cv2.RETR_EXTERNAL,
    cv2.CHAIN_APPROX_SIMPLE)

它告诉OpenCV用直线近似轮廓,创建多边形。(我不确定cv2.RETR_外部参数此时的作用。)

有没有办法不让直线穿过图像?你可以找到直线的交点,然后只画线段。这仍然会给我一些原始图像中没有的多边形。有一个简单的解决方案。这个简单的解决方案是什么?