通过ConvexHull检测矩形(四边形)

时间:2016-08-22 04:27:16

标签: python opencv image-processing geometry

我想从图像中检测矩形

我使用cv2.findContours()cv2.convexHull()来过滤掉不规则的多边形。

之后,我将使用船体长度来确定轮廓是否为矩形。

hull = cv2.convexHull(contour,returnPoints = True)
if len(hull) ==4:
    return True

但是,有时,convexHull()会返回长度为5 的数组。 如果我使用上述标准,我将错过这个矩形。

例如, enter image description here

使用cv2.canny()enter image description here

通过使用上述方法,我将获得船体:

 [[[819 184]]

 [[744 183]]

 [[745 145]]

 [[787 145]]

 [[819 146]]]

enter image description here

这是我的问题:给定长度为5的数组(凸壳),我如何确定它是否实际指的是四边形?谢谢。

=============================================== ====================== 更新:

使用Sobel X和Y方向后,

sobelxy = cv2.Sobel(img_inversion, cv2.CV_8U, 1, 1, ksize=3)

我得到了: enter image description here

2 个答案:

答案 0 :(得分:3)

那么, 这不是提取矩形的正确方法。由于我们在这里讨论基础知识,我建议你采用图像的反演并在X和Y方向上应用Sobel,然后运行findcontours函数。然后,通过这个,您将能够获得许多可以过滤掉的矩形。您将不得不应用大量检查来识别其中包含文本的矩形。另外我不明白你为什么要强制选择长度为5的矩形。你正在限制比例。

其次,另一种方法是使用Sobel X和Y图像,然后应用OpenCVs LineSegmentDetector。一旦得到所有线段,你必须应用RANSAC(四配合),所以这里的条件应该是一组随机选择的交叉线上的所有角度应该是锐角(粗略),最后用文本过滤出四边形(为此使用SWT或其他可靠的技术)。

至于你的查询,你应该选择理想长度为4(点)的四元组。

参考:Crop the largest rectangle using OpenCV

此链接将为您提供以非常简单的方式检测矩形的要点。

下面的图片为您提供了一种反转和sobel图像的演练。图像反转消除了你从索贝尔那里获得的双重界限。

对于Inversion,您可以使用代字号运算符。

enter image description here

同样在进行反演之前,最好还是抑制光照伪影。这可以使用同态滤波来完成。或记录图像。

答案 1 :(得分:0)

将矩形拟合为凸多边形并不容易。

您可以通过旋转卡尺(https://en.wikipedia.org/wiki/Rotating_calipers)来尝试找到最小面积或最小周长矩形。

然后通过比较船体和矩形的面积/周长,您可以评估“矩形”。