Opencv:将平面图图像转换为数据模型

Sch*_*ken 11 c++ opencv model image-processing javacv

我的计划是从纸上绘制的平面图中提取信息.我已经设法检测到70-80%的拉门:

检测平面图中的门

现在我想从墙上创建一个数据模型.我已经设法提取它们,你可以在这里看到:

提取墙壁 从那我创造了轮廓:

提取墙线 我现在的想法是从该图像中获取线条的交叉点并从中创建数据模型.但是,如果我使用houghlines算法,我得到这样的东西:

在此输入图像描述 有人对如何获得交叉点或甚至另一个想法如何获得模型有不同的想法?会很好的.

PS:我正在使用javacv.但是opencv中的算法也可以正常,因为我可以翻译它.

Gil*_*evi 5

首先,也可以使用线段检测器来检测线条:http : //www.ipol.im/pub/art/2012/gjmr-lsd/

如果我理解正确的话,问题是您会为每个“真实”行获得几条不同的短行。您可以获取“短线”的所有端点并使用 fitLine() 近似一条交叉的线:http ://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=fitline#fitline


Jos*_*ner 1

让我惊讶的是,你真正想要的不一定是墙壁,而是房间——顺便说一下,房间是由墙壁界定的。

此外,虽然看起来你的“墙”数据相当嘈杂(即有很多小部分可能会被误认为是小房间),但你的“房间”数据却不是(房间里没有很多幻影墙)房间中间)。

因此,检测房间(大约轴对齐的矩形,不包含超过特定阈值的白色像素)并通过查看附近像素之间的边界来推断墙壁可能是有益的。

我将分三个阶段实现这一点:首先,尝试从 houghlines 的输出中检测一些主轴(我将首先使用 K 均值聚类算法,然后调整输出以获得垂直轴)。使用此数据可以更好地对齐图像。

其次,开始在图像的黑色区域中随机播种小矩形。向各个方向“生长”这些矩形,直到每条边都遇到超过特定阈值的白色像素,或者它们遇到另一个矩形。继续播种,直到图像的大部分区域被覆盖。

第三,找到未被矩形覆盖的区域(希望也是矩形),并将它们折叠成线:

  • 独立对待 x&y 轴上矩形的坐标 - 作为间隔的集合
  • 对这些坐标进行排序,并查找形成一个矩形的上界和另一个矩形的下界的相邻坐标。
  • 天真地尝试将沿每个轴找到的这些间隙配对,并测试生成的候选矩形是否与房间相交。丢弃相交的矩形。
  • 将这些新矩形沿其主轴线折叠成线。
  • 然后,当在某个最小距离内时,可以将线末端的点连接起来(通过延长线直到它们相交)。

这种方法有一些缺点:

  • 它不能很好地处理非轴对齐的墙壁。幸运的是,无论如何,您可能希望这些在大多数情况下自动对齐。
  • 它很可能将墙壁上的小门口视为墙壁的一部分 - 线条图中的意外间隙。这些必须单独检测并添加回重建的绘图中。
  • 它不能很好地处理噪声数据 - 但看起来你已经用 opencv 完成了数据去噪的出色工作!

我很抱歉没有包含任何代码片段 - 但我认为传达想法比细节更重要(如果您希望我扩展其中任何内容,请发表评论)。另请注意,虽然我几年前使用过 opencv,但我绝不是专家 - 因此它可能已经有一些原语可以为您完成一些工作。