【问题标题】:OpenCV find polygonsOpenCV 查找多边形
【发布时间】:2014-11-21 20:42:34
【问题描述】:

我正在使用 EmguCV 并尝试在图像中查找多边形。以下是有关该问题的一些事实:

1) 多边形是不规则形状的,但边总是在两个角度之一。

2) 多边形的侧面通常有需要填充的间隙。

3) 如果一个多边形包含在另一个多边形中,我想忽略它。

考虑这张图片:

我想找到以红色突出显示的多边形,省略以绿色突出显示的多边形,并在此处以蓝色显示的间隙建立连接:

我已经使用 HoughLinesBinary 取得了一些成功,然后将最近的线段端点相互连接以弥合间隙以构建完整的多边形,但是当涉及多个多边形时这不起作用,因为它会尝试绘制线如果它们碰巧彼此靠近,则在多边形之间。

有人有什么想法吗?

【问题讨论】:

  • 为什么应该以这种方式添加最低的蓝线而不是直角的 2 条蓝线?总而言之,您可能想使用“格式塔心理学”的结果(google it)。
  • 如果将最低的蓝线变成直角的两条线,实际上会更准确。我不认为这是可行的,因为图像的那个区域是模糊的,但如果可能的话,那就太好了。
  • 这应该都是关于将现有元素/线分组到对象(距离/连续性等是决定qn元素属于哪个对象的因素)。以及如何填补对象中的空白。格式塔心理学研究涵盖了这两个主题,但可能仍然是悬而未决的问题:)
  • 我对图像处理编码还很陌生,仍然在为 HoughLines 方法的参数含义而苦恼……我绝对不够先进,无法开始将实验心理学原理应用于我的代码.
  • 所以你希望你的代码像人类一样填补空白,但你想通过简单的方法来实现?尝试简单的启发式(距离)将边缘段聚集到对象,但不要期望这对每个输入都有效!

标签: opencv polygon detection emgucv


【解决方案1】:

我认为问题可能出在您的图像阈值上。 我不知道你是怎么做的,但是如果二进制图像更好,你可以得到更好的结果。

我喜欢你连接多边形段的想法,尽量确保你将连接的线具有最大和最小长度,以避免连接到最近的对象。

验证新的线连接是否形成 90 度角,即使它是一个角。

添加: 您可以使用形态学运算符来根据角度增长线条。正如你所说,这些线条有已知的角度,使用这样的蒙版进行扩张

0 0 0 1 1 0 0 0 0

此蒙版只会在连接到另一侧之前增加线条。

【讨论】:

  • 相对于输入图像,二进制图像实际上非常好。多边形边上的间隙确实存在于输入图像中,因为这些区域被其他图像遮挡。
【解决方案2】:

一般的解决方案会很困难,但对于您的特定问题,相对简单的启发式应该可以工作。

主要思想是使用墙壁一侧的白色像素作为附加功能。图像中的墙壁总是有一面几乎是黑色的一面,一面有许多白噪声像素。白噪声相对于墙壁的方向不会在拐角处切换,因此使用此信息可以消除线之间的许多可能连接。

首先是一些定义:

图片中的所有墙壁要么从左下到右上(上升线),要么从左上到右下(下降线)。

如果下降线的左侧有更多的白色像素,则将其称为 falling-left-wall,否则称为 falling-right-wall。上升线也一样。

每条线都以两个点结束。调用最左边的一个start,最右边的一个end

现在是算法:

  • 对图像中的每一行和每个起点/终点进行分类。
    检查每条线两侧的紧邻区域,看看哪一侧包含更多的白色像素。
    之后,您有一个标记为 falling-left-wall-start、rising-left-wall-end 等的点列表。

  • 对于每个起点/终点:

    • 从另一条线寻找附近的起点/终点

    • 如果是falling-left-wall-start,只寻找:

      • 一个落下的左墙端

      • 一个上升的左墙起点,如果该点位于当前行的左侧

      • 一个上升的右墙端,如果该点在当前行的右侧

    • 在找到的点中选择最近的点,连接到当前点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多