我想从图像中检测矩形

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

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

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

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

例如,
python - 凸包检测矩形(四边形)-LMLPHP

使用cv2.canny()之后
python - 凸包检测矩形(四边形)-LMLPHP

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

 [[744 183]]

 [[745 145]]

 [[787 145]]

 [[819 146]]]

python - 凸包检测矩形(四边形)-LMLPHP

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

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

使用Sobel X和Y方向后,
sobelxy = cv2.Sobel(img_inversion, cv2.CV_8U, 1, 1, ksize=3)

我有:
python - 凸包检测矩形(四边形)-LMLPHP

最佳答案

好,
这不是提取矩形的正确方法。既然我们在这里讨论基础知识,我建议您进行图像反转,然后在X和Y方向上应用Sobel,然后运行findcontours函数。然后,您将可以获得很多可以过滤的矩形。您将不得不进行大量检查以识别其中包含文本的矩形。我也不明白为什么要强制选择长度为5的矩形。您在限制比例。

其次,另一种方法是使用Sobel X和Y图像,然后应用OpenCV的LineSegmentDetector。一旦获得了所有线段,就必须应用RANSAC进行(四边形拟合),因此这里的条件应该是一组随机选择的相交线上的所有 Angular 都应该是锐角(大致),最后用text滤除四边形为此使用SWT或其他可靠的技术)。

对于您的查询,您应该选择理想长度为4(点)的四边形。

参考:Crop the largest rectangle using OpenCV

该链接将为您提供以非常简单的方式检测矩形的技巧。

下面的图像为您提供了图像的反转和清晰的演练。图像反转消除了sobel带来的双重障碍。

对于反转,请使用代字号运算符。

python - 凸包检测矩形(四边形)-LMLPHP

同样在进行反转之前,最好抑制照明伪影。这可以使用同态过滤来完成。或拍摄图像日志。

关于python - 凸包检测矩形(四边形),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39071418/

10-15 05:59