Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV查找多边形_Opencv_Polygon_Detection_Emgucv - Fatal编程技术网

OpenCV查找多边形

OpenCV查找多边形,opencv,polygon,detection,emgucv,Opencv,Polygon,Detection,Emgucv,我正在使用EmguCV并尝试在图像中查找多边形。以下是关于这个问题的一些事实: 1) 多边形的形状是不规则的,但边始终是两个角度中的一个 2) 多边形的边上通常有需要填充的间隙 3) 如果一个多边形包含在另一个多边形中,我想忽略它 以这幅图像为例: 我想找到以红色突出显示的多边形,忽略以绿色突出显示的多边形,并在间隙之间建立连接,如蓝色所示: 我使用HoughLinesBinary取得了一些成功,然后将最近的线段端点相互连接,以桥接间隙来构建一个完整的多边形,但是当涉及多个多边形时,这不起作

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

1) 多边形的形状是不规则的,但边始终是两个角度中的一个

2) 多边形的边上通常有需要填充的间隙

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

以这幅图像为例:

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

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


有人有什么想法吗?

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

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

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

增加: 您可以使用moephologic运算符将直线按一定角度增长。正如你所说的,这些线有已知的角度,使用这样的遮罩进行膨胀

0 0 0 1 1 0 0 0 0


这个遮罩只会沿着直线生长,直到连接到另一边。

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

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

首先是一些定义:

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

如果下降线的左侧有更多的白色像素,则称之为下降的左墙,否则称为下降的右墙。上升线也一样

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

现在查看算法:

  • 对图像中的每条线和每条起点/终点进行分类。
    检查每行两侧的直接区域,看看哪一侧包含更多的白色像素。
    之后,将有一个标记为“左墙下降起点”、“左墙上升终点”等的点列表

  • 对于每个起点/终点:

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

    • 如果是从左墙开始下落,请仅查找:

      • 落下的左端墙

      • 如果该点位于当前线的左侧,则为上升的左墙起点

      • 如果该点位于当前直线的右侧,则为上升的右墙端点

    • 在找到的点中拾取最近的点,将其连接到当前点


相对于输入图像,二进制图像实际上非常好。多边形边上的间隙确实存在于输入图像中,因为这些区域被其他图像遮挡。为什么要这样添加最低的蓝线,而不是以直角添加两条蓝线?总之,你可能想使用“格式塔心理学”(google it)的结果。如果最低的蓝线变成两条直角的线,实际上会更准确。我不认为这是可行的,因为图像的那个区域是模糊的,但如果可能的话,那就太好了。这应该是关于将现有元素/线分组到对象(距离/连续性等是决定对象qn元素所属的因素)。以及如何填充对象中的间隙。格式塔心理学研究涵盖了这两个主题,但可能仍然是一个有待解决的问题:)我对图像处理的编码相当陌生,仍然在为HoughLines方法的论点的意义而挣扎。。。我肯定还不够先进,无法开始将实验心理学原理应用到我的代码中。所以你希望你的代码像人类一样填补空白,但你想通过简单的方法来实现吗?尝试使用简单的启发式(距离)将边段聚类到对象,但不要期望这对每个输入都有效!