OpenCV找到多边形

时间:2014-11-21 20:42:34

标签: opencv polygon detection emgucv

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

1)多边形是不规则形状的,但两侧总是处于两个角度中的一个。

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

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

考虑这张图片:

enter image description here

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

enter image description here

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

有人有什么想法吗?

2 个答案:

答案 0 :(得分:0)

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

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

验证新的线条关节是否形成90度角,即使它是一个角。

添加了: 您可以使用moephological运算符来增加与角度相关的线条。正如你所说,已知角度的线条使用这样的掩模进行扩张

0 0 0 1 1 0 0 0 0

这个面具只会生长线,直到与另一面相连。

答案 1 :(得分:0)

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

主要思想是使用墙壁一侧的白色像素作为附加功能。图像中的墙总是有一个近乎黑色的边,一边有许多白噪声像素。白噪声相对于墙壁的方向不会打开角落,因此使用此信息可以消除线条之间的许多可能连接。

首先是一些定义:

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

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

每一行以两点结束。调用最左边的一个开始,最右边的一个结束

现在算法:

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

  • 每个开始/结束点:

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

    • 如果是 fall-left-wall-start ,则只查找:

      • 一个左下方的墙

      • 左上角开始,如果该点位于当前行的左侧

      • 如果该点位于当前行的右侧,则为右上方的墙端

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