一种室内点云场景的墙壁结构分析与重建方法
技术领域
本发明属于计算机视觉和图像处理方法
技术领域
,涉及一种室内点云场景的墙壁结构分析与重建方法。背景技术
现实世界的各种场景是人类感知世界的最重要组成部分,其中室内场景作为现实场景的重要构成,其三维模型的建立具有广泛的应用前景。
在室内场景中,墙壁作为重要的组成元素,并且存在着门和窗户等细节信息,都直接影响了墙壁模型的逼真程度。同时,场景中物体对墙壁的遮挡以及门窗等墙壁结构的多样性,也使得墙壁的重建存在巨大的挑战。目前关于墙面重建的研究中,很少有能够重建出完整墙壁模型的方法,大多只针对某一墙壁结构进行研究,并且有的只针对特定状态的门进行研究,而忽略了其他状态的门。
发明内容
本发明的目的是提供一种室内点云场景的墙壁结构分析与重建方法,解决了现有技术中存在的因遮挡造成的数据缺失以及忽略门状态的问题。
本发明所采用的技术方案是,一种室内点云场景的墙壁结构分析与重建方法,具体按照如下步骤实施:
步骤1,对室内场景进行遮挡检测,确定场景中墙壁上的遮挡区域;
步骤2,在步骤1获得的遮挡区域内提取墙壁数据,并根据局部特征对墙壁结构进行划分;
步骤3,对经步骤2处理的墙壁数据进行门的识别;
步骤4,确定经步骤3处理的墙壁数据的门的状态,并进行重建。
本发明的特征还在于,
步骤1具体为:
步骤1.1,设定体素大小为10cm×10cm×10cm,将室内场景用三维体素来表示,然后在每个体素内用体素中所有点的重心来近似显示体素中其他点,即该体素内的所有点用一个重心点最终表示,最后对所有体素进行处理,从而得到下采样后的点云场景,并将其作为下一阶段的输入数据;
步骤1.2,确定扫描位置、扫描半径和扫描点,从而构建检测遮挡的扫描光线,具体为:
步骤1.2.1,根据遮挡区域和造成遮挡的物体的角度确定扫描位置O;
步骤1.2.2,计算扫描半径Rscan,具体为:
Vol=LxLyLz (2)
其中,γ为比例因子;Vol为室内场景的体积;N为室内场景中点的数量;Lx为室内场景在X轴方向上的长度;Ly为室内场景在Y轴方向上的长度;Lz为室内场景在Z轴方向上的长度;
步骤1.2.3,确定扫描点Pscan,具体为:
根据扫描半径Rscan,将点云数据中的墙壁划分为多个扫描区域,长度为Lx,高度为Lz的墙壁,划分m×l个扫描区域;长度为Ly,高度为Lz的墙壁,划分n×l个扫描区域,其中,m=ceil(Lx/(2×Rscan)),n=ceil(Ly/(2×Rscan)),l=ceil(Lz/(2×Rscan)),ceil(x)为取整函数,然后计算每个扫描区域的中心点,该中心点就是扫描点;
步骤1.2.4,对于平行于XOZ的墙壁,以Z轴坐标为基准,从X坐标的最小值到X坐标的最大值,为扫描点指定顺序,表示为
对于平行于YOZ的墙壁,以Z轴坐标为基准,从Y坐标的最小值到Y坐标的最大值,为扫描点指定顺序,表示为
步骤1.2.5,在确定扫描位置、扫描半径以及扫描点后,从扫描位置O向每个扫描点发射一条射线,从而构建扫描光线;
步骤1.3,根据步骤1.2所构建的扫描光线,利用光线追踪法确定场景中墙壁上的遮挡区域。
步骤1.3具体为:
步骤1.3.1,按照步骤1.2中指定的顺序获取未搜索的扫描点
步骤1.3.2,应用KNN算法搜索扫描点在扫描半径内是否存在近邻点,若存在近邻点,表示该区域不是遮挡区域,并跳转到步骤1.3.1,否则表示该区域可能存在遮挡,并跳转到步骤1.3.3;
步骤1.3.3,根据两点式三维直线方程(3)确定扫描位置O与扫描点之间的射线,将公式(4)带入公式(3),计算出新的扫描点(x,y,z),若新的扫描点不在扫描点和扫描位置之间时,则表示该区域不是遮挡区域,并跳转到步骤1.3.1,否则跳转到步骤1.3.4;
式中:为扫描点的坐标;(ox,oy,oz)为扫描位置O的坐标;Rscan为扫描半径;
步骤1.3.4,应用KNN算法搜索扫描点在扫描半径内是否存在近邻点,若存在近邻点,表示该区域为遮挡区域,并跳转到步骤1.3.1,否则跳转到步骤1.3.3;
步骤1.3.5,直到所有的扫描点都已经被搜索,从而确定场景中墙壁上的所有遮挡区域,并对遮挡造成的空洞区域进行标记。
步骤2具体为:
步骤2.1,将原始点云场景数据作为输入数据,来对室内场景中的墙壁数据进行进一步处理;
步骤2.2,使用主成分分析法进行特征计算;
步骤2.3,根据局部特征对墙壁结构进行划分。
步骤2.1具体为:
步骤2.1.1,随机选择原始点云场景数据中的三个点作为局内点,拟合平面;
步骤2.1.2,设定距离阈值,判断经步骤2.1.1拟合的平面周围距离阈值内的点是否为局内点,若属于,将这些点加入到平面中,并且更新平面;
步骤2.1.3,对更新后的平面重复执行步骤2.1.2的操作,直到没有局内点加入到平面中,若平面局内点数大于局内点数量阈值,则输出平面;
步骤2.1.4,将墙壁数据从经过步骤2.1.3输出的平面中提取出来,具体为:首先,确定整个扫描场景的高度Hwhole;然后,由于墙壁是支撑着整个场景的结构,其高度与场景高度Hwhole相近,而场景中的门,它的高度一般是墙壁高度的3/4,所以,根据此先验知识,设定提取墙壁的高度阈值Hwall为(Hwhole×3/4,Hwhole];最后,根据高度阈值对平面进行过滤,计算各平面的高度,若平面的高度在高度阈值范围内,则将该平面进行提取,从而获得墙壁数据。
步骤2.2具体为:
步骤2.2.1,建立KD-tree,用来组织经步骤2.1提取的墙壁点云数据中的所有点,然后对于每一个点p,利用KD-tree查询其k个近邻点,并使用公式(5)计算协方差矩阵:
式中:∑为3x3的协方差矩阵;Pi为点p的第i个近邻点;
步骤2.2.2,通过奇异值分解求解标准特征值方程,得到点p的法向量,法向量是在特征向量V矩阵中的第三个特征向量,记为np,表示点p的法向量;
λV=∑V (6)
式中:V为特征向量矩阵;λ为特征值矩阵;
步骤2.2.3,在λ的矩阵中,λ3表示点的曲率值,因此,点p的曲率值就是λ3,并将其记为λp。
步骤2.3具体为:
步骤2.3.1,为墙壁点云数据中的每个点定义平面标记,初始标记为0,即Index=0,表示该点未被标记,若Index=1,则表示该点已被标记;
步骤2.2.2,创建一个用来存储点的栈;
步骤2.3.3,选择曲率最小的点作为种子点,并对该种子点标记为Index=1,然后将该种子点存入栈中;
步骤2.3.4,若栈不为空,则从栈中取出栈顶的种子点,并计算该种子点的近邻点,判断种子点和近邻点的法向量夹角的余弦值cos;
步骤2.3.5,若1-cos<0.1,再判断近邻点的曲率是否小于设定的曲率阈值,若小于,则认为是同一平面内的点,并且该近邻点未被标记时,则将该近邻点标记为Index=1并压入栈中;否则,跳转到步骤2.3.4;
步骤2.3.6,若栈为空,则表示已经成功提取到一个平面,并将已经标记过的点从墙壁点云数据中删除,然后对剩余的未被标记的点重复步骤2.3.3-2.3.5,直到不存在未被标记的点为止,则结束该墙壁的平面分割;
步骤2.3.7,获得经过步骤2.3.1-2.3.6确定的墙壁上的不同平面后,根据公式(7)确定划分墙壁的单位网格的边长L;
式中:β为比例因子,用来调节小网格的边长;S为墙壁的面积;N为墙壁点的总数;
步骤2.3.8,根据公式(8)计算墙壁划分的网格的数量numgrid;
numgrid=numw×numh (8)
numw=lw/L (9)
numh=lh/L (10)
式中:numgrid为墙壁的网格数量;numw为墙壁宽度上占的网格数量;numh为墙壁高度上占的网格数量;lw为墙壁的宽度;lh为墙壁的高度。
步骤2.3.9,计算各网格中点的数量gridnum;
步骤2.3.10,若gridnum=0,判断该网格是否属于遮挡,若属于,标记该网格为遮挡,并用蓝色显示,否则,标记该网格为空,用红色显示;
步骤2.3.11,对于gridnum≠0的网格,用各网格中点的RGB信息表示对应的网格,并根据网格的RGB信息统计各网格的数量,按照降序的方式进行排序,将数量最多的网格标记为墙壁,用黑色显示;若存在除墙壁外的另一种颜色,并且这类网格的数量在给定数量范围内,则标记该网格为候选门,从而实现对墙壁结构的划分。
步骤3具体为:
步骤3.1,将步骤2划分后的墙壁结构中点数小于数量阈值的分割平面进行删除,然后分析剩余墙壁分割平面与XOZ坐标轴的平行关系,对于平行于坐标轴的平面,应用AABB包围盒提取该平面角点;对于与坐标轴不平行的平面,应用OBB包围盒提取该平面角点;
步骤3.2,根据包围盒的角点信息,计算各平面的体积Vbox,其中使用AABB包围盒进行角点检测的平面使用公式(11)进行计算,使用OBB包围盒进行角点检测的平面使用公式(12)进行计算,将体积最大的平面标记为墙壁;
Vbox=(max_AABBx-min_AABBx)×(max_AABBy-min_AABBy)×(max_AABBz-min_AABBx) (11)
Vbox=l1×l2×l1 (12)
式中:(max_AABBx,min_AABBx)为AABB在x轴上的最大值和最小值;(max_AABBy,min_AABBy)为AABB在y轴上的最大值和最小值;(max_AABBz,min_AABBz)为AABB在z轴上的最大值和最小值;l1,l2,l3为OBB三个轴的长度;
步骤3.3,计算各平面的高度,其中墙壁高度记为lwall,其余平面高度分别记为l1,l2,…;
步骤3.4,分析各平面与墙壁的高度比例,若某个平面的高度在墙壁高度的3/4的范围内,即则标记该平面为门,否则标记为其余物体,其中,为波动范围。
步骤4具体为:
步骤4.1,利用经步骤3确定的各平面中的点的法向量之间的夹角进行边界提取;
步骤4.2,将经过步骤4.1获取的边界点进行投影,并对这些投影点拟合直线;
步骤4.3,根据经过步骤4.2获得的拟合各平面的直线计算门与墙壁所形成的夹角,对门的状态进行分析;
步骤4.4,根据经过步骤4.3所确定的门的状态以及对步骤3.1所获得的各平面的角点信息进行上采样,拟合平面,实现对墙壁的重建工作。
步骤4.1具体为:
步骤4.1.1,利用主成分分析法PCA提取经步骤3确定的各平面中的点的法向量;
步骤4.1.2,将每个点pi和它的k近邻点Nj(j=0,1,…,k-1)组成的点集Xi向其法向量ni所垂直的平面进行投影,其投影点集为X′i={(x′i,y′i,z′i)|i=0,1,…t},t为投影点的数量;
步骤4.1.3,以pi投影点p′i为起始点,以其近邻点Nj投影点N′j为终点,定义向量p′iN′j(j=0,1,…,k-1),并求每个向量p′iN′j与该平面法向量的叉积,即ni×p′iN′j,其中两个向量叉积的结果是一个向量,并且该向量与这两个向量和垂直;
步骤4.1.4,任取一投影向量p′iN′j,求其它投影向量与该向量的夹角αj,以及与该向量的叉积ni×p′iN′j的夹角βj,其中规定若βj≥90°,则αj=360°-αj;
步骤4.1.5,应用快速排序法对αj(j=0,1,…,k-1)进行排序,使其从大到小有序,则相邻向量间的夹角可由公式(13)表示,然后,估计相邻向量之间的最大夹角是否大于角度阈值ε,若大于角度阈值,则该点为边界点;
步骤4.1.6,继续寻找下一个边界点,直到找到各平面的所有边界点;
步骤4.2具体为:
步骤4.2.1,确定经步骤3获得的各平面点云数据的z轴的最大值和最小值;
步骤4.2.2,取其z轴的平均值作为投影的平面;
步骤4.2.3,将经步骤4.1获得的墙壁和门的边界点向XOY平面进行投影,获得墙壁和门的点云数据投影点;
步骤4.2.4,根据这些投影点通过最小二乘法来拟合直线;
步骤4.3具体为:
步骤4.3.1,获得经步骤4.2拟合的墙壁和门的两条直线方程如公式(14)进行联立,计算交点ζ(x12,y12);
步骤4.3.2,分别将用来拟合这两条直线的点云数据分为10段,分析每段的点密度,若某段点密度与其它段点密度的差值大于密度阈值,则该段点密度较其它段点密度来说明显增加,若某段点密度较其它段的点密度来说明显增加,则取该段所有点x的平均值,并根据其直线方程得到y坐标,否则,若每段的点密度均匀,则随机选取该直线的一点,记经过这一步求得的坐标为θ(xθ,yθ);
步骤4.3.3,根据交点和坐标θ(xθ,yθ),使用公式(15)计算直线的斜率k,计算两直线的斜率分别为k1,k2;
步骤4.3.4,根据斜率k1和k2,计算两直线的角度,若k1·k2=-1,则直线夹角为90°,否则根据公式(16)计算两直线的正切值tanλ;
步骤4.3.5,若k1·k2≠-1,则根据反正切函数arctan计算λ,若λ为负数,则直线夹角为π+λ,否则直线夹角为λ;
步骤4.3.6,根据所获得的直线夹角判断门的状态,若两条直线夹角大于等于90°,则其为打开的门;若两条直线夹角在[0°,5°)范围内,则其为关闭的门;若两条直线夹角在[5°,90°)范围内,则其为半开的门;
步骤4.4具体为:
步骤4.4.1,根据经步骤3.1获得的角点信息,选取角点连接中长度最长的边L为基准,设定需要采样数量Nup,然后,根据公式(17)经计算采样距离,即采样点之间的距离;
式中:disup——采样距离;L——角点连接中最长的边;Nup——采样数量。
步骤4.4.2,从经步骤3.1获得的角点信息中坐标最小的点开始,根据采样距离disup依次输出点,实现数据的上采样;
步骤4.4.3,使用随机抽样一致性方法拟合平面,即随机选择上采样数据上的三个点,确定一个平面,将这个平面的设定距离内的点加入到该平面,更新平面,直到所有点都被处理,完成平面的拟合,实现墙壁的重建。
本发明的有益效果是:
本发明解决了遮挡造成的数据缺失问题,提高了重建结果的准确性。本发明的墙面重建工作,在有效性,稳定性和准确性上都有了很大的提高,并且拥有较好的鲁棒性,丰富了计算机图形学和视觉智能的方法体系。
本发明首先通过遮挡检测与平面分割对墙壁结构进行划分,有效地解决了遮挡所造成的数据缺失问题,提高了划分墙壁结构的准确性;然后使用基于角点检测的门识别方法,以较高的准确度对墙壁上的门元素进行识别;最后根据边界提取与直线拟合的门状态识别与重建方法准确地对门的状态进行分析,完整的将包含关闭和打开的门的墙壁进行重建,最终重建效果好。
附图说明
图1是本发明方法实施例的步骤1中输入原始数据;
图2是本发明一种室内点云场景的墙壁结构分析与重建方法实施例的步骤1中得到的下采样结果;
图3是本发明一种室内点云场景的墙壁结构分析与重建方法实施例的步骤1中构建的扫描光线结果;
图4是本发明一种室内点云场景的墙壁结构分析与重建方法实施例的步骤1中获得的遮挡标记结果的数据;
图5是本发明一种室内点云场景的墙壁结构分析与重建方法实施例的步骤2中得到的场景分割结果;
图6是本发明一种室内点云场景的墙壁结构分析与重建方法实施例的步骤2中得到的墙壁的提取数据;
图7是本发明一种室内点云场景的墙壁结构分析与重建方法实施例的步骤2中得到的墙壁结构划分数据;
图8是本发明一种室内点云场景的墙壁结构分析与重建方法实施例的步骤3中得到的点云数据的角点结果;
图9是本发明一种室内点云场景的墙壁结构分析与重建方法实施例的步骤4中获得的点云数据边界点结果;
图10是本发明一种室内点云场景的墙壁结构分析与重建方法实施例的步骤4中基于投影点拟合直线结果;
图11是本发明一种室内点云场景的墙壁结构分析与重建方法实施例的步骤4中墙壁重建结果。
具体实施方式
下面结合附图和具体实施方式对本发明进行详细说明。
本发明是一种室内点云场景的墙壁结构分析与重建方法,具体按照如下步骤实施:
步骤1,对室内场景进行遮挡检测,确定场景中墙壁上的遮挡区域;具体为:
步骤1.1,设定体素大小为10cm×10cm×10cm,将室内场景用三维体素来表示,如图1所示,然后在每个体素内用体素中所有点的重心来近似显示体素中其他点,即该体素内的所有点用一个重心点最终表示,最后对所有体素进行处理,从而得到下采样后的点云场景,如图2所示,并将其作为下一阶段的输入数据;
步骤1.2,确定扫描位置、扫描半径和扫描点,从而构建检测遮挡的扫描光线,如图3所示,具体为:
步骤1.2.1,根据遮挡区域和造成遮挡的物体的角度确定扫描位置O;
步骤1.2.2,计算扫描半径Rscan。由于扫描半径过大会导致检测的遮挡结果不准确;扫描半径过小,会降低检测效率,严重时会造成程序的崩溃。因此,本文根据空间点密度计算扫描半径Rscan。将扫描半径Rscan的值取小些,以保证在最适当的范围内进行检测,降低检测的时间。因此,计算扫描半径Rscan,具体为:
Vol=LxLyLz (2)
其中,γ为比例因子;Vol为室内场景的体积;N为室内场景中点的数量;Lx为室内场景在X轴方向上的长度;Ly为室内场景在Y轴方向上的长度;Lz为室内场景在Z轴方向上的长度;
步骤1.2.3,确定扫描点Pscan,具体为:
根据扫描半径Rscan,将点云数据中的墙壁划分为多个扫描区域,长度为Lx,高度为Lz的墙壁,划分m×l个扫描区域;长度为Ly,高度为Lz的墙壁,划分n×l个扫描区域,其中,m=ceil(Lx/(2×Rscan)),n=ceil(Ly/(2×Rscan)),l=ceil(Lz/(2×Rscan)),ceil(x)为取整函数,然后计算每个扫描区域的中心点,该中心点就是扫描点;
为扫描点指定顺序,方便后序实验的进行。由于大多数的墙壁都是垂直于地面并且相邻的墙壁是垂直的,因此,此处分两类为扫描点指定顺序。
步骤1.2.4,对于平行于XOZ的墙壁,以Z轴坐标为基准,从X坐标的最小值到X坐标的最大值,为扫描点指定顺序,表示为
对于平行于YOZ的墙壁,以Z轴坐标为基准,从Y坐标的最小值到Y坐标的最大值,为扫描点指定顺序,表示为
步骤1.2.5,在确定扫描位置、扫描半径以及扫描点后,从扫描位置O向每个扫描点发射一条射线,从而构建扫描光线;
步骤1.3,根据步骤1.2所构建的扫描光线,利用光线追踪法确定场景中墙壁上的遮挡区域,如图4所示,具体为:
步骤1.3.1,按照步骤1.2中指定的顺序获取未搜索的扫描点
步骤1.3.2,应用KNN算法搜索扫描点在扫描半径内是否存在近邻点,若存在近邻点,表示该区域不是遮挡区域,并跳转到步骤1.3.1,否则表示该区域可能存在遮挡,并跳转到步骤1.3.3;
步骤1.3.3,根据两点式三维直线方程(3)确定扫描位置O与扫描点之间的射线,将公式(4)带入公式(3),计算出新的扫描点(x,y,z),若新的扫描点不在扫描点和扫描位置之间时,则表示该区域不是遮挡区域,并跳转到步骤1.3.1,否则跳转到步骤1.3.4;
式中:为扫描点的坐标;(ox,oy,oz)为扫描位置O的坐标;Rscan为扫描半径;
步骤1.3.4,应用KNN算法搜索扫描点在扫描半径内是否存在近邻点,若存在近邻点,表示该区域为遮挡区域,并跳转到步骤1.3.1,否则跳转到步骤1.3.3;
步骤1.3.5,直到所有的扫描点都已经被搜索,从而确定场景中墙壁上的所有遮挡区域,并对遮挡造成的空洞区域进行标记;
步骤2,在步骤1获得的遮挡区域内提取墙壁数据,并根据局部特征对墙壁结构进行划分;具体为:
步骤2.1,将原始点云场景数据作为输入数据,来对室内场景中的墙壁数据进行进一步处理;具体为:
步骤2.1.1,随机选择原始点云场景数据中的三个点作为局内点,拟合平面;
步骤2.1.2,设定距离阈值,判断经步骤2.1.1拟合的平面周围距离阈值内的点是否为局内点,若属于,将这些点加入到平面中,并且更新平面;
步骤2.1.3,对更新后的平面重复执行步骤2.1.2的操作,直到没有局内点加入到平面中,若平面局内点数大于局内点数量阈值,则输出平面,如图5所示;
步骤2.1.4,将墙壁数据从经过步骤2.1.3输出的平面中提取出来,具体为:首先,确定整个扫描场景的高度Hwhole;然后,由于墙壁是支撑着整个场景的结构,其高度与场景高度Hwhole相近,而场景中的门,它的高度一般是墙壁高度的3/4,所以,根据此先验知识,设定提取墙壁的高度阈值Hwall为(Hwhole×3/4,Hwhole];最后,根据高度阈值对平面进行过滤,计算各平面的高度,若平面的高度在高度阈值范围内,则将该平面进行提取,从而获得墙壁数据,如图6所示;
步骤2.2,使用主成分分析法进行特征计算;具体为:
步骤2.2.1,建立KD-tree,用来组织经步骤2.1提取的墙壁点云数据中的所有点,然后对于每一个点p,利用KD-tree查询其k个近邻点,并使用公式(5)计算协方差矩阵:
式中:∑为3x3的协方差矩阵;Pi为点p的第i个近邻点;
步骤2.2.2,通过奇异值分解求解标准特征值方程,得到点p的法向量,法向量是在特征向量V矩阵中的第三个特征向量,记为np,表示点p的法向量;
λV=∑V (6)
式中:V为特征向量矩阵;λ为特征值矩阵;
步骤2.2.3,在λ的矩阵中,λ3表示点的曲率值,因此,点p的曲率值就是λ3,并将其记为λp;
步骤2.3,根据局部特征对墙壁结构进行划分;具体为:
步骤2.3.1,为墙壁点云数据中的每个点定义平面标记,初始标记为0,即Index=0,表示该点未被标记,若Index=1,则表示该点已被标记;
步骤2.2.2,创建一个用来存储点的栈;
步骤2.3.3,选择曲率最小的点作为种子点,并对该种子点标记为Index=1,然后将该种子点存入栈中;
步骤2.3.4,若栈不为空,则从栈中取出栈顶的种子点,并计算该种子点的近邻点,判断种子点和近邻点的法向量夹角的余弦值cos;
步骤2.3.5,若1-cos<0.1,再判断近邻点的曲率是否小于设定的曲率阈值,若小于,则认为是同一平面内的点,并且该近邻点未被标记时,则将该近邻点标记为Index=1并压入栈中;否则,跳转到步骤2.3.4;
步骤2.3.6,若栈为空,则表示已经成功提取到一个平面,并将已经标记过的点从墙壁点云数据中删除,然后对剩余的未被标记的点重复步骤2.3.3-2.3.5,直到不存在未被标记的点为止,则结束该墙壁的平面分割;
步骤2.3.7,获得经过步骤2.3.1-2.3.6确定的墙壁上的不同平面后,根据公式(7)确定划分墙壁的单位网格的边长L;
式中:β为比例因子,用来调节小网格的边长;S为墙壁的面积;N为墙壁点的总数;
步骤2.3.8,根据公式(8)计算墙壁划分的网格的数量numgrid;
numgrid=numw×numh (8)
numw=lw/L (9)
numh=lh/L (10)
式中:numgrid为墙壁的网格数量;numw为墙壁宽度上占的网格数量;numh为墙壁高度上占的网格数量;lw为墙壁的宽度;lh为墙壁的高度。
步骤2.3.9,计算各网格中点的数量gridnum;
步骤2.3.10,若gridnum=0,判断该网格是否属于遮挡,若属于,标记该网格为遮挡,并用蓝色显示,否则,标记该网格为空,用红色显示;
步骤2.3.11,对于gridnum≠0的网格,用各网格中点的RGB信息表示对应的网格,并根据网格的RGB信息统计各网格的数量,按照降序的方式进行排序,将数量最多的网格标记为墙壁,用黑色显示;若存在除墙壁外的另一种颜色,并且这类网格的数量在给定数量范围内,则标记该网格为候选门,从而实现对墙壁结构的划分,如图7所示。
步骤3,对经步骤2处理的墙壁数据进行门的识别;具体为:
步骤3.1,将步骤2划分后的墙壁结构中点数小于数量阈值的分割平面进行删除,然后分析剩余墙壁分割平面与XOZ坐标轴的平行关系,对于平行于坐标轴的平面,应用AABB包围盒提取该平面角点;对于与坐标轴不平行的平面,应用OBB包围盒提取该平面角点,如图8所示;
步骤3.2,根据包围盒的角点信息,计算各平面的体积Vbox,其中使用AABB包围盒进行角点检测的平面使用公式(11)进行计算,使用OBB包围盒进行角点检测的平面使用公式(12)进行计算,将体积最大的平面标记为墙壁;
Vbox=(max_AABBx-min_AABBx)×(max_AABBy-min_AABBy)×(max_AABBz-min_AABBx) (11)
Vbox=l1×l2×l1 (12)
式中:(max_AABBx,min_AABBx)为AABB在x轴上的最大值和最小值;(max_AABBy,min_AABBy)为AABB在y轴上的最大值和最小值;(max_AABBz,min_AABBz)为AABB在z轴上的最大值和最小值;l1,l2,l3为OBB三个轴的长度;
步骤3.3,计算各平面的高度,其中墙壁高度记为lwall,其余平面高度分别记为l1,l2,…;
步骤3.4,分析各平面与墙壁的高度比例,若某个平面的高度在墙壁高度的3/4的范围内,即则标记该平面为门,否则标记为其余物体,其中,为波动范围。
步骤4,确定经步骤3处理的墙壁数据的门的状态,并进行重建,具体为:
步骤4.1,利用经步骤3确定的各平面中的点的法向量之间的夹角进行边界提取,如图9所示,具体为:
步骤4.1.1,利用主成分分析法PCA提取经步骤3确定的各平面中的点的法向量;
步骤4.1.2,将每个点pi和它的k近邻点Nj(j=0,1,…,k-1)组成的点集Xi向其法向量ni所垂直的平面进行投影,其投影点集为X′i={(x′i,y′i,z′i)|i=0,1,…t},t为投影点的数量;
步骤4.1.3,以pi投影点p′i为起始点,以其近邻点Nj投影点N′j为终点,定义向量p′iN′j(j=0,1,…,k-1),并求每个向量p′iN′j与该平面法向量的叉积,即ni×p′iN′j,其中两个向量叉积的结果是一个向量,并且该向量与这两个向量和垂直;
步骤4.1.4,任取一投影向量p′iN′j,求其它投影向量与该向量的夹角αj,以及与该向量的叉积ni×p′iN′j的夹角βj,其中规定若βj≥90°,则αj=360°-αj;
步骤4.1.5,应用快速排序法对αj(j=0,1,…,k-1)进行排序,使其从大到小有序,则相邻向量间的夹角可由公式(13)表示,然后,估计相邻向量之间的最大夹角是否大于角度阈值ε,若大于角度阈值,则该点为边界点;
步骤4.1.6,继续寻找下一个边界点,直到找到各平面的所有边界点;
步骤4.2,将经过步骤4.1获取的边界点进行投影,并对这些投影点拟合直线;具体为:
步骤4.2.1,确定经步骤3获得的各平面点云数据的z轴的最大值和最小值;
步骤4.2.2,取其z轴的平均值作为投影的平面;
步骤4.2.3,将经步骤4.1获得的墙壁和门的边界点向XOY平面进行投影,获得墙壁和门的点云数据投影点;
步骤4.2.4,根据这些投影点通过最小二乘法来拟合直线,如图10所示;
步骤4.3,根据经过步骤4.2获得的拟合各平面的直线计算门与墙壁所形成的夹角,对门的状态进行分析;具体为:
步骤4.3.1,获得经步骤4.2拟合的墙壁和门的两条直线方程如公式(14)进行联立,计算交点ζ(x12,y12);
步骤4.3.2,分别将用来拟合这两条直线的点云数据分为10段,分析每段的点密度,若某段点密度与其它段点密度的差值大于密度阈值,则该段点密度较其它段点密度来说明显增加,若某段点密度较其它段的点密度来说明显增加,则取该段所有点x的平均值,并根据其直线方程得到y坐标,否则,若每段的点密度均匀,则随机选取该直线的一点,记经过这一步求得的坐标为θ(xθ,yθ);
步骤4.3.3,根据交点和坐标θ(xθ,yθ),使用公式(15)计算直线的斜率k,计算两直线的斜率分别为k1,k2;
步骤4.3.4,根据斜率k1和k2,计算两直线的角度,若k1·k2=-1,则直线夹角为90°,否则根据公式(16)计算两直线的正切值tanλ;
步骤4.3.5,若k1·k2≠-1,则根据反正切函数arctan计算λ,若λ为负数,则直线夹角为π+λ,否则直线夹角为λ;
步骤4.3.6,根据所获得的直线夹角判断门的状态,若两条直线夹角大于等于90°,则其为打开的门;若两条直线夹角在[0°,5°)范围内,则其为关闭的门;若两条直线夹角在[5°,90°)范围内,则其为半开的门;
步骤4.4,根据经过步骤4.3所确定的门的状态以及对步骤3.1所获得的各平面的角点信息进行上采样,拟合平面,实现对墙壁的重建工作,具体为:
步骤4.4.1,根据经步骤3.1获得的角点信息,选取角点连接中长度最长的边L为基准,设定需要采样数量Nup,然后,根据公式(17)经计算采样距离,即采样点之间的距离;
式中:disup——采样距离;L——角点连接中最长的边;Nup——采样数量。
步骤4.4.2,从经步骤3.1获得的角点信息中坐标最小的点开始,根据采样距离disup依次输出点,实现数据的上采样;
步骤4.4.3,使用随机抽样一致性方法拟合平面,即随机选择上采样数据上的三个点,确定一个平面,将这个平面的设定距离内的点加入到该平面,更新平面,直到所有点都被处理,完成平面的拟合,实现墙壁的重建,如图11所示。