本文主要是介绍Automated 3D volumetric reconstruction of multiple-room building interiors for as-built BIM 论文阅读笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
(学生党自写,可能存在错误,欢迎指正,侵删)
ABSTRACT
目前点云的全自动化建模面临的几个挑战:(1)包含多个房间的复杂室内环境(2)噪声滤波(3)门窗等体积大,细节丰富的物体表现困难
步骤:输入配准的三维点云数据并按房间进行分割;通过天花板高度附近的空间判断扫描点是杂波还是建筑构件,并将滤波后的点投影到二值图上来跟踪地板-墙壁边界;通过进一步的分割和正则化来细化;通过内部和外部墙壁构件建模来估计墙体体积;最后墙壁点被分割投影到逆二值图,检测中空区域并建模成窗户和门。
效果:与人工生成模型比较,发现两个生成模型均方根误差分别为0.089和0.074m。
INTRODUCTION
BIM模型
建筑信息模型(BIM)是一种设施的数字表示,它记录了从建造到拆除的建筑生命周期的所有相关信息,包括三维设计图纸、进度、材料属性、成本和安全规范。
BIM分为两种,as-designed BIM指的是设计好但未实现的BIM,as-built BIM指的是已建好部分的BIM。后者通常由激光扫描现场后的数据处理生成,可用作建筑方面的指导。
激光扫描获得的是点云数据,从点云数据自动创建as-built BIM是一个节省成本的方式。典型as-built BIM主要涉及三个方面:构件的建模,构件的类别,材质等属性,以及构件之间的相互关系。其中几何建模的构建是承载其它信息的主要介质,也是本文的重点。
文章主要贡献
(1)提供了一种过滤原始点云中噪声等受污染数据的方法;
(2)提供了一种创建细节丰富的墙壁构件的方法;
(3)调整最终的生成模型并通过定量分析评估该模型。
METHODOLOGY
输入数据的前提条件
(1)天花板和地板是平面,且相互平行,与垂直墙壁相交。
(2)不同房间由狭窄通道和共用墙壁连接
(3)所有结构均是直线形式,可以用平行或正交的直线建模。
(4)输入点云为配准后的点云,其“向上”的方向与Z轴平行。
大体步骤
(1)高度估计:计算沿z轴的点数直方图,找到代表天花板和地板的两个高密度点组。
(2)投影点云到XY平面的一个二值图(binary map)
(3)房间分割
(4)通过天花板偏移空间(offset space)来过滤噪声
(5)边界提取,并基于墙与墙之间的正交或平行这一特征做最小二乘调整。
(6)采用内外壁墙壁建模方式对墙体进行建模。内墙负责分割房间,外墙负责分割内部和外部环境。
(7)按墙线分割出点云,投影到逆二值图(inverse binary map),通过追踪中空区域并做规范化的方式进行门窗建模。
(8)输出3D模型
输出
由地板、天花板、体积墙、窗户和门的一组几何组件组成的3D模型。生成几何模型是LOD3级别的。
步骤图:
高度估计
视天花板和地板是平行结构且和垂直墙壁相交。在Z轴上区分点组,并分组统计该层次上点的数目构成直方图。分离两个最大的点组,计算各自的平均z值分别代表天花板和地板的高度。
房间分割
目的:分离出每个房间单独的点云,为后续工作做准备
思路:房间被定义为一个由垂直墙壁包围的区域,通过开放的门彼此相连。如果将开口关闭,就可以单独分离出一个房间。
具体步骤
(1)只保留天花板附近空间(这个空间范围由用户自定义,最好不包含窗户)的和地板上的点,这一步可以有效减少窗外环境导致的噪声。
(2)点云二维栅格化:将点云投影到XY平面的一个二值网格图上,其中1代表该区域有扫描点,而0代表没有。投影结果如下图b(a是未除噪前的点云投影)
(3)通过圆形检测窗口(circular-shaped detection window)的方式对房间进行分割:设置一个半径大于所有门口和通道宽度的半径r,以所有有点(为1)的网格为中心,检测其半径r内的全部栅格。若其中有一个栅格没有点(为0),则将该区域划入unsegmented area中;否则,划入initial segment中。下图是划分的具体过程图示,最终结果如上张图c(黑色部分是unsegmented area,白色部分是initial segment)
(4)下面的操作是基于每一个被划分出的白色联通区域的(即每个房间):构建墙壁部分:使用新的检测窗口(半径推荐为之前圆形窗口的两倍),以每个白色区域的网格为中心,检测窗口内没有点(为0)的网格并记录,最终构成了下图中绿色的部分。
(5)对每块绿色部分使用骨架化算法(细化算法,一种图像处理算法,能够提取出二值图中某一块区域的大体结构,常被用于文字识别的预处理中,详细可见文章圖像細化(骨架化)算法 分析_Iam_Rocky的博客-CSDN博客_骨架化算法),提取出很多段的墙壁结构。
(6)连接各段墙壁:以墙壁结构的端点为首尾和距离计算标准,每次用直线连接两个距离最近的墙壁结构。连接采用的算法是Bresenham算法(一种在二维图像上画直线的算法,图形学的基础算法之一,详细可见文章直线绘制算法-Bresenham算法_着风少年的博客-CSDN博客)。最终获得的是一个仅有一个开口的墙壁结构,如下图d。
(7)闭合开口:对于墙壁结构每个端点,删除一定半径(取最大门窗大小就行)内的结构(图e中的橙色区域),在剩余的结构中取一个最长的结构,然后在原结构中当它不存在。此时墙体结构又变为两段,重新执行上一步中的连接,在执行一次连接(重新变为一段墙体结构)后恢复之前被删除的那段最长的墙体结构,这样就形成了一个闭合的墙壁切割(如图f)
(8)对每个白色区域执行一遍上述的操作,就能获得每个区域的墙壁切割线。
壁面线提取
目的:这一阶段主要是用来提取地板和墙壁相交的边界。
经观察,发现墙壁结构在垂直方向上覆盖的范围能达到天花板,而大多数杂波(就是家具等的点云)是无法达到这个高度的。可以利用这一点来去除杂波。
具体步骤:
(1)采用上一步投影到XY平面的二维栅格图(栅格大小也一样),对于每一个栅格中的所有点做一个z轴分布直方图。若在天花板附近有分布,则这个栅格中的所有点都归为墙壁的一部分(此处的一个trick是垂直分布直方图只限定范围在天花板附近空间内,若直方图里有点则判断改栅格为墙壁,这也是原文的方法)。最终结果如图a,蓝色的是属于墙壁的点,而红色则是不属于墙壁的。
(2)投影到XY平面的结果如图b所示,白色的为房间区域,灰色的为外围区域,而蓝色的为墙壁边界。图b可以看出墙壁线是断开的,这就需要通过之前的开口闭合算法连接墙壁线使其形成一个闭合区域。
(3)最后,利用边界跟踪算法(似乎有很多种,如可以搜索到一个满足条件的外围边界点然后以它为起点寻找图像边界)将投影墙体的最外层网格单元检测为地板-墙壁边界。
壁面线细化/规范化
目的:前一步提取后结果如下图a,从壁线可以看出边界并不是由直线组成,而这样的边界是不规范的,因此需要对其细化/规范化。
具体步骤:
(1)用Douglas-Peucker算法(一种将点拟合成数条直线的方法,可参考文章https://blog.csdn.net/xhtchina/article/details/113829959)将边界分割成单独的墙壁表面线,重复这个过程,最终得到如图b所示的分割线。
(2)基于壁面线之间的关系只有正交和平行的假设,使用约束最小二乘法(关于最小二乘法的思想可参考文章如何理解最小二乘法?_马同学图解数学的博客-CSDN博客_最小二乘法)对结果进行正则化。通过Hessian线模型(表示形式是xcosα+ysinα = r,α是相对于原点的方向,r是相对于原点的距离)来表示最后的直线。
(3)根据墙壁的连接关系进行直角提取。但有时由于过分割的缘故,两条相交的线是相互平行的(如图b中下侧黄色和紫色的线)。因此在执行角提取前,需要对相连的两条线是平行还是正交做一次判断。如果是平行的则不进行角提取,并根据它们之间参数r的差值来决定是否合并(一般是差值小于网格单元大小时合并),若不合并则只保留较长的一条用于下次角提取。图c展现了整个流程后的结果。
伪代码如下:
墙壁建模
目的:用高度,长度和厚度三要素定义的长方体来表示墙体。其中高度都是统一的,因此只需定义墙体的位置,长度和厚度。墙壁分为内墙(房间内的墙)和外墙(隔离房子和外部环境的墙)两种,两种要分别建模。
内墙建模
内墙建模是要先于外墙的。因为外墙线实际上就是不满足内墙线条件后剩下的墙线。
(1)选择某个房间的一条墙线a,确定该墙面的数个垂足;寻找其它房间与该线平行的墙线b,若有a的垂足能落在这个墙线b上,则判断b在a的面向范围内。加入集合B。如下图a,蓝色为选中墙线,红色则是其正对应的墙面。
(2)对B中所有候选墙线做一个筛选,保证其之间的区域不会和另一个房间重叠(如下图d中黄色区域)若筛选后集合B中没有元素了,则判断选中墙线为外墙线。
(3)若是内墙线,则继续处理:找到与其相连的两条正交墙线确定墙壁长度(如下图b中紫色部分),通过对应平行墙线确定墙壁厚度,最终形成如下图c中黄色区域的墙壁。
外墙建模
由于点云数据只反映了室内数据,因此需要用户自己定义外墙壁厚度。
(1)根据墙壁长度和厚度生成六个候选分量(如图a),两个长的代表墙壁,四个小正方形代表墙角
(2)判断并去除和房间重叠的分量,结果如图b。
门窗建模
目的:提取细节丰富的门窗开口。主要分为三个阶段:壁点分割,开口提取和细化。
壁点分割:根据壁面线对壁点进行分割。若某点满足如下两个条件:(1)该点垂线(可能用的是法向量)落在壁面线上(2)与壁面线的正交距离小于一个阈值,则该点分配给该壁面线。图a是分割后所属某个壁面线的所有点,可以看出其中有中空区域,这些中空区域来自窗户和门。
开口提取:将分割后的壁点投影到逆二值图上,追踪空心区域的边界,并根据周长平方与面积之比的性质判断是否为矩形。(此处的两篇参考文章分别为Productive modeling for development of as-built BIM of existing indoor structures和Road sign detection using image processing & re-cognition,前者的大概原理猜测是通过在逆二值图上执行外边界追踪算法来求空心区域的边界,后者的目的是为了去除一些噪声空心边界,但我想不到是怎么做的,若有需要可以看看原论文)将判断为矩形的部分判定为内部开口。
细化:对内开口边界再次执行Douglas-Peucker算法,分割出直线段边界如图b;将分割边界再次分为上下左右四个部分,对于每个部分根据其中各直线段之间的距离和连接关系进行合并,最终每个区域提取出一条直线段如图c。根据直线段间正交和平行关系对其进行限制性最小二乘调整,最终结果如图d。
将细化后的窗口投影到对应的墙壁建模上。注意内墙中一个真实窗口往往对应着其上两个平行墙线各自检测出的一个窗口,需要判断对应关系,并调整小的开口使其对应大的开口。
RESULT AND DISCUSSION
研究地点和数据采集
数据采集地点包括一所学校和一个公寓。学校由一条长廊和两边的教书构成,公寓相对较小,但内部结构更复杂。示意图如下:
采用FARO的配准软件进行配准,用Matlab作为实现方式。
(省略中间调参部分,我写了但这部分感觉对于理论学习没啥实际作用就不发了)
结果
以人工建立的两个场所的模型为groundtruth,与机器自动生成的模型作比较求偏差来展示算法效果。将生成的模型采用CAD格式重建,导入到AutoCAD并采样不同特征位置(如角落等)在两个模型中的坐标。测量方式采用了欧氏平均距离误差(EADE)、均方根误差(RMSE)和球面精度标准(SAS)三种不同的方法。结果如下表:
EADE公式如下,n为测点总数,ai为本方法自动建模的特征点位置,bi为人工模型的对应点,R和T为三维Helmert变化的旋转和平移参数,本测量方法中假设两个模型是1:1的,因此没有放大缩小参数。旋转和平移参数是通过训练获得的:
RMSE是一种常用的测量方法,表示估计值与观测值之间的差异,而SAS表示球半径在90%置信水平下的位置精度。公式如下,其中ait表示转换到人工模型坐标系的点。
存在的问题
1.倾斜的墙壁和楼梯无法通过本方法重建(下图a,b),一些扫描时被其它物体阻塞的开口也无法提取(下图c,d)。
2.扫描途中透明玻璃门的折射效果可能会导致在另一个相连房间形成类似墙壁的噪声点云,导致房间分割的错误(下图a,b);而玻璃门帘等的折射效果也可能导致房间两侧门窗建模时有一边不能提取出门窗,这时需要将另一边的开口复制到该侧(下图c,d)。
CONCLUSION
本文的亮点:
1.房间分割和噪声滤波部分是采用了较少约束的输入。
2.本文提出的墙体构件模型尤其适用于具有不同厚度和开口的墙体建模(此处的“不同厚度”指的是下图中红色圈圈出部分这样的,简单来说就是同一段墙分出了厚度)。
3.建模过程的全自动化。
存在的缺陷:
1.需要高密度均匀点云
2.仍会受某些空间噪声影响
3.无法建模不规则房间
4.个人认为输入参数仍然很多(如网格的大小,Douglas参数等),而且其中某些参数是需要一定计算机专业知识去理解且需要实际使用者不断调整的。这是自动化的阻碍。
这篇关于Automated 3D volumetric reconstruction of multiple-room building interiors for as-built BIM 论文阅读笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!