我想从图像中检测矩形。
我使用cv2.findContours()
和cv2.convexHull()
过滤掉了不规则多边形。
之后,我将使用船体的长度来确定轮廓是否为矩形。hull = cv2.convexHull(contour,returnPoints = True)
if len(hull) ==4:
return True
但是,有时convexHull()
将返回一个长度为5 的数组。
如果我使用上面的标准,我将错过这个矩形。
例如,
使用cv2.canny()
之后
通过使用上述方法,我将获得船体: [[[819 184]]
[[744 183]]
[[745 145]]
[[787 145]]
[[819 146]]]
这是我的问题:给定长度为5的数组(凸包),我如何确定它是否实际上是指四边形?谢谢。
================================================== ===================
更新:
使用Sobel X和Y方向后,sobelxy = cv2.Sobel(img_inversion, cv2.CV_8U, 1, 1, ksize=3)
我有:
最佳答案
好,
这不是提取矩形的正确方法。既然我们在这里讨论基础知识,我建议您进行图像反转,然后在X和Y方向上应用Sobel,然后运行findcontours函数。然后,您将可以获得很多可以过滤的矩形。您将不得不进行大量检查以识别其中包含文本的矩形。我也不明白为什么要强制选择长度为5的矩形。您在限制比例。
其次,另一种方法是使用Sobel X和Y图像,然后应用OpenCV的LineSegmentDetector。一旦获得了所有线段,就必须应用RANSAC进行(四边形拟合),因此这里的条件应该是一组随机选择的相交线上的所有 Angular 都应该是锐角(大致),最后用text滤除四边形为此使用SWT或其他可靠的技术)。
对于您的查询,您应该选择理想长度为4(点)的四边形。
参考:Crop the largest rectangle using OpenCV
该链接将为您提供以非常简单的方式检测矩形的技巧。
下面的图像为您提供了图像的反转和清晰的演练。图像反转消除了sobel带来的双重障碍。
对于反转,请使用代字号运算符。
同样在进行反转之前,最好抑制照明伪影。这可以使用同态过滤来完成。或拍摄图像日志。
关于python - 凸包检测矩形(四边形),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39071418/