【问题标题】:Rectangle(quadrilateral) Detection by ConvexHullConvexHull 检测矩形(四边形)
【发布时间】:2016-08-24 01:38:10
【问题描述】:

我想从图像中检测 矩形

我使用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)

我得到:

【问题讨论】:

  • 这是检测车牌的非常糟糕的解决方案。你应该寻找更强大的东西。
  • @Miki 你对此有什么建议吗?
  • 你可以从OpenALPR开始
  • 这是一个好主意,但它是免费的,每月只有 1500 次识别。我正在通过车载摄像头进行实时识别。
  • 它是开源的,你可以看到里面发生了什么并自己制作。此外,您只需为云服务付费

标签: python opencv image-processing geometry


【解决方案1】:

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

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

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

参考:Crop the largest rectangle using OpenCV

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

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

对于 Inversion,您使用波浪号运算符。

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

【讨论】:

  • 感谢您的回复。车牌的轮廓长度为 5。这就是为什么我选择长度为 5 的原因。
  • findContours 需要二值图像,因此要么设置 Sobel 震级阈值,要么它没有意义。
  • 进行反演后,我无法获得与您的Sobel 相同的图像。使用sobelxy = cv2.Sobel(img_inversion, cv2.CV_8U, 1, 1, ksize=1)是否正确?
  • 对不起,我不擅长 Python,我是一个 C++ 人。但据我所知,内核大小不是 = 1,而是应该是 = 3
  • @AnubhavRohatgi 不过,我得到了错误的图像。 (更新了问题中的图片)
【解决方案2】:

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

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

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

【讨论】:

  • 我想强制执行一个四边形,但是我从 python opencv 得出的一些近似轮廓有 > 4 个边。我尝试在例如上再次运行 cv2.approxPolyDP() 16 面多边形,但它不起作用。有什么想法吗?
  • @jtlz2:你可以尝试通过旋转卡尺找到最小面积或最小周长矩形
  • 它是一个四边形,而不是一个矩形。
  • @jtlz2:您的大部分帖子都是基于矩形的。
  • @jtlz2:对于车牌,找到一个矩形就足够了。如果你坚持,你可以找到船体最靠近矩形的四个边,并把它们延长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
相关资源
最近更新 更多