一种改进八叉树和自适应读取的大规模点云可视化方法与流程

文档序号:23805293发布日期:2021-02-03 08:17阅读:49来源:国知局
一种改进八叉树和自适应读取的大规模点云可视化方法与流程

[0001]
本发明属于三维数据可视化领域技术领域,具体涉及一种改进八叉树和自适应读取的大规模点云可视化方法。


背景技术:

[0002]
随着激光雷达和各类三维数据扫描仪在各个应用领域的不断应用,同时三维点云的数据量也在此过程中的不断扩大,如何实现大规模点云的高效的存储结构和快速实时的可视化以及后续的处理应用成为急需解决的关键问题。尤其是在一些特定的领域如数字化古代文化建筑保护、数字城市管理、军工设备测量和数字孪生等,这些领域普遍具有亿量级点云的规模,数据量非常庞杂,如何实时的对大规模点云进行实时可视化显得尤为关键。
[0003]
合理高效的数据结构、可视化策略和快速存取大规模点云,直接关系到点云数据在实际工程当中的可视化效果。而大规模点云的可视化的质量和实时性,又关系到大规模点云数据重建和处理等的效率,这也是三维激光技术能够得到广泛运用所必须要解决的问题。近年也提出了不少的点云可视化的方法,但对于大规模点云而言这类方法依然在可视化的渲染效率比较低、卡顿和运行的硬件要求高等问题上有着很多的不足。
[0004]
针对现有技术中大规模点云可视化的渲染效率低和运行硬件要求高等问题,目前尚未提出有效的解决方案。


技术实现要素:

[0005]
本发明针对现有技术中的不足,提供一种改进八叉树和自适应读取的大规模点云可视化方法,解决现有技术中大规模点云可视化的渲染效率低和运行硬件要求高等问题。
[0006]
为实现上述目的,本发明采用以下技术方案:提供一种改进八叉树和自适应读取的大规模点云可视化方法,包括:
[0007]
步骤1,通过改进的基于obb外包围盒的八叉树结构来建立点云空间索引;
[0008]
步骤2,对基于改进八叉树的空间索引结构构建lod图形加速可视化模型;
[0009]
步骤3,基于视锥体和lod模型的可视化点云节点的选择调度;
[0010]
步骤4,使用多线程与二级缓存方法将选择的点云节点进行快速读取和可视化渲染。
[0011]
为优化上述技术方案,采取的具体措施还包括:
[0012]
进一步地,步骤1具体包括:
[0013]
步骤11,根据点云总数量设定一个八叉树的基础层数,用于下一个步骤点云的快速分配;以obb法获取最小正方体外包围盒。并根据点云总点数设定八叉树基本层数,将最小外包围盒进行划分成多个对应层数的子外包围盒,即逐层八叉树的包围盒的所有父节点按照长宽高对半均匀分成八个子外包围盒。并获得相应每个子包围盒的位置信息,用于下一步将点快速分配至对应叶节点;
[0014]
步骤12,将整个点云分为多个小批次读入,并根据点的坐标将点放入所对应的子
外包围的八叉树叶节点中,若叶节点中的点数超过设定的节点最多存储点数阈值,则以当前叶节点为父节点,生成下一层新的叶节点,并将当前叶节点内的所有点云分配给下一层;完成每一个批次的处理,保存一次数据,以减少内存的占用;直到所有点云最终落入八叉树的叶节点当中;最后遍历叶节点,删除空节点,若其父节点的八个子节点全为空,也进行删除;
[0015]
步骤13,将最终的八叉树结构中的点云数据进行存储。
[0016]
进一步地,步骤2具体包括:
[0017]
步骤21,首先自下而上对叶节点的点云数据进行泊松圆盘下采样,将叶节点下采样的点云进行拼接放入上一层对应的父节点中,按照此规律逐层进行下采样和将点云放入父节点,直至根节点位置;
[0018]
步骤22,将点云传递后的八叉树进行存储,并按层设定lod模型。
[0019]
进一步地,步骤21包括,将每个从子节点采样并填入父节点中的点数据从当前子节点中删除,最终将原始点云分块存入八叉树各个节点中,将一个完整的扫描点云文件分割为不同的组成部分进行存储。
[0020]
进一步地,步骤3包括:
[0021]
步骤31,基于视锥体视点远近选择需要可视化的lod层级;
[0022]
步骤32,根据视锥体遮挡剔除的可见性判断来显示节点。
[0023]
进一步地,步骤31包括,设定一个标准值s,定义为模型的外包围盒在屏幕上的投影面积projectionarea与模型距离视点的最小距离dst
min
的比值来确定,公式如下:
[0024]
s=projectionarea/dst
min
[0025]
该投影面积定义为去除距离视点距离最远和最近的包围盒顶点后,剩余的六个顶点在视椎体近平面上的投影面积area与每个三维点云在屏幕视椎体近平面上的投影大小pointprojectionarea,以及一个权重w的乘积来表示,具体公式如下:
[0026]
projectionarea=w
·
point projectionarea
·
area
[0027]
权重w是各个点在屏幕上所占大小的定权因子,dst
min
定义为距离视点最近的包围盒顶点与视点之间的距离。
[0028]
进一步地,标准值s与lod层i的对应公式如下:
[0029]
s∈[(i-1)
·
(s
max-s
min
)/n,i
·
(s
max-s
min
)/n]
[0030]
其中s
max
,s
min
分别为s的最大最小值,其中n为lod总层数;
[0031]
在对lod模型进行显示时将根据公式对应lod层进行检索,根据当前s值来确定需要加载的lod层级,假设s值处于第2层的值,则需要加载绘制lod模型的1,2两级数据,如果此时s值变大到下一个范围,则加载lod第3层级的数据,如果s值缩小到上一个范围,则删除第3层级数据点即可。
[0032]
进一步地,步骤4包括:
[0033]
步骤41,首先使用一个线程去读取步骤3选择的节点在内存或者硬盘中的点云;
[0034]
步骤42,使用另一个单独的渲染进程去不断渲染内存中存储的需要可视化的节点中的点;
[0035]
步骤43,使读取点云进程与渲染进程同时进行,提高点云显示的流畅度。
[0036]
进一步地,步骤41包括,调度进程持续根据步骤3的条件进行节点选择,对于符合
要求的节点的点允许其一直待在可视化节点存储容器vector_rendering中;而对于可视化过程中不符合规则的节点,则存入另一个二级内存临时存储容器vector_temp,并清除可视化节点存储容器vector_rendering以腾出空间容纳新来的点;在下一帧需要新的节点时,优先在vector_temp进行搜索,若存在需要的节点则直接存入vector_rendering,并在vector_temp中删除;若不存在,则在硬盘中读取相应节点;vector_temp在存储过程中如果超过限定的节点数,则删除最早存入的节点。
[0037]
本发明的有益效果是:本发明为现有技术中大规模点云可视化的渲染效率低和运行硬件要求高等问题提供了高效的实时大规模点云可视化方法,可以有效提高大规模点云的渲染的实时性和显示效果,且对于运行硬件要求不高。
附图说明
[0038]
图1是本发明方法实施例的流程图。
[0039]
图2是本发明的一个实施例中obb外包围盒示意图。
[0040]
图3是本发明的一个实施例中视椎体区域判断节点示意图。
[0041]
图4是根据本发明的一个实施例中八叉树读取和渲染过程的流程图。
具体实施方式
[0042]
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式,相反,他们仅是与如所附权利要求书中所详述的、本发明的一些方面相一致的装置和方法的例子。现在结合附图对本发明作进一步详细的说明。
[0043]
为解决现有技术中大规模点云可视化的渲染效率低和运行硬件要求高等问题,提供一种高效的实时大规模点云可视化方法,图1示出该算法的一种可选的流程图,如图1所示,该方法包括如下步骤:
[0044]
步骤1,通过改进的基于obb外包围盒的八叉树结构来建立点云空间索引;
[0045]
步骤2,对基于改进八叉树的空间索引结构构建lod图形加速可视化模型;
[0046]
步骤3,基于视锥体和lod模型的可视化点云节点的选择调度;
[0047]
步骤4,使用多线程与二级缓存方法将选择的点云节点进行快速读取和可视化渲染。
[0048]
步骤1包括:
[0049]
步骤11,首先根据设定obb法设定最小外包围盒,它的立方体的方向始终沿着主成分方向,满足了八叉树索引的最小外包围盒。因为obb包围的边长始终与点云数据的主成分方向相同,可以通过构建点云数据模型的协方差矩阵来计算其特征值和特征向量,从而确定包围盒,具体生成obb包围盒的协方差矩阵如下:
[0050][0051]
其中
[0052]
conv(x
i
,x
j
)=e|(x
i-u
i
)(x
j-u
j
)]
[0053]
u
i
,u
j
分别为x
i
,x
j
的均值。通过构建的协方差矩阵a计算其特征向量与特征值,因为协方差矩阵a是一个对称矩阵,根据对称矩阵的性质可以知道它的三个特征向量互相垂直,以此来确定obb模型的三个轴。
[0054]
接着将特征向量正规化,从而确定obb包围盒三个轴的方向,然后将点云的坐标投影到三个轴上,确定各轴最大最小值,即可确定出obb包围盒。并以包围盒最大边长为最小正方体外包围盒的边长,以包围盒中心为最小正方体外包围盒中心,建立点云八叉树的最小正方体外包围盒,如图2所示。
[0055]
步骤12,根据点云总数量设定一个八叉树的基础层数,并计算相应每个子包围盒的坐标位置,此步骤是为了加快初期树的构建速度;
[0056]
步骤13,将整个点云的每五百万个点为一个小批次读入,并根据点的坐标将点放入所对应的子外包围的八叉树叶节点中,若叶节点中的点数超过设定的节点最多存储点数阈值,则以当前叶节点为父节点,生成下一层新的叶节点,并将当前叶节点内的所有点云分配给下一层,完成每一个批次的处理,保存一次数据,以减少内存的占用;直到所有点云最终落入八叉树的叶节点当中;最后遍历叶节点,删除空节点,若其父节点的八个子节点全为空,也进行删除;步骤14,遍历叶节点,删除空叶节点,若其父节点的八个叶结点全为空,也进行删除;
[0057]
步骤15,最后将八叉树结构中的点云数据进行存储。
[0058]
步骤2包括:
[0059]
步骤21,在已经构建好八叉树索引,并且原始点云数据已经全部分流到最下层叶节点的基础上,使用泊松圆盘采样方法,按照事先规定好的采样率,将子节点中抽取出的点云数据填充到上一层的父节点中,并以此类推,最终将八叉树索引中的所有节点均填充上数据点。在这个过程中,为了防止每一层lod模型产生重复的数据点,造成数据冗余,在实际的采样填充过程中,将每个从子节点采样并填入父节点中的点数据从当前子节点中删除,最终将原始点云分块存入八叉树各个节点中,将一个完整的扫描点云文件分割为不同的组成部分进行存储,同时又不会造成数据冗余。为了使最终八叉树结构下,所有节点内的点数量大致均衡,所以设计了一种针对子节点个数变化的动态的采样率,其公式如下:
[0060]
samplingrate=1/num
childnode
[0061]
其中samplingrate为各父节点的对子节点采样的采样率,num
childnode
表示当前节点的子节点个数。通过该公式,可以计算出当前节点的采样率。
[0062]
步骤22,将点传递后的八叉树进行了存储,并按层设定lod模型。
[0063]
步骤3包括:
[0064]
步骤31,根据视点距离来确定所选取lod的层级,需要确定一个作为判断依据的标准值,以及该值的参考范围与lod层级分辨率相对应的规则。
[0065]
本方法设定了一个标准值s,定义为模型的外包围盒在屏幕上的投影面积projectionarea与模型距离视点的最小距离dst
min
的比值来确定,公式如下:
[0066]
s=projectionarea/dst
min
[0067]
其中需要首先计算projectionarea,本文当中,将该投影面积定义为去除距离视点距离最远和最近的包围盒顶点后,剩余的六个顶点在视椎体近平面上的投影面积area与
每个三维点云在屏幕该区域上的投影大小pointprojectionarea,以及一个权重w的乘积来表示,具体公式如下:
[0068]
projectionarea=w
·
point projectionarea
·
area
[0069]
权重w是各个点在屏幕上所占大小的定权因子,因为由于在投影到二维屏幕上时,会出现部分点重叠的情况,所以这个定权因子w可以更平均的反应该区域内所有点在屏幕上的所占的大小。dst
min
则定义为距离视点最近的包围盒顶点与视点之间的距离。
[0070]
当点云模型距离屏幕越近时,它在二维屏幕上的投影面积越大,dst
min
越小,e的值越大,而这时则需要显示分辨率较高的层级,所以当s越大时,调度显示的层级数越大。标准值s与lod层i,的对应公式如下:
[0071]
s∈[(i-1)
·
(s
max-s
min
)/n,i
·
(s
max-s
min
)/n]
[0072]
其中n为lod层级,s
max
,s
min
分别为s的最大最小值,在对该模型进行显示时将根据公式对应lod层进行检索,根据当前s值来确定需要加载的lod层级,假设s值处于第2层的值,则需要加载绘制lod模型的1,2两级数据,如果此时s值变大到下一个范围,则加载lod第3层级的数据,如果s值缩小到上一个范围,则删除第3层级数据点即可,这样就实现了基于视点远近的lod模型动态调度。
[0073]
步骤32,在根据视点远近调度lod层级点云的基础上,又添加了一种基于可见性遮挡剔除的节点选择的方法。在选出的lod层级中进一步筛选需要加载的节点,其判断依据就是该节点是否存在于视锥体内部。
[0074]
要判断点是否在视椎体内,需要首先确定视椎体六个面的平面方程,通常我们可以通过一种六面体计算法来确定,使用这种算法,可以快速得到相机空间,世界空间,物体空间的视椎体。
[0075]
在这个算法中,初始假设观察矩阵和世界矩阵均为单位化矩阵,即视点默认处于坐标原点,所求的平面方程也就确定了当视点位于坐标原点时的视椎体。当模型与视点之间的距开始远离时,如果采用模型静止,而移动视点的方法,视椎体也会发生平移,从而可以对距离不断靠近下的点云模型进行视椎体裁切。接下来,使用求得的视椎体来进行点云的绘制判断。判断的依据就是在选定的lod的层级下,加载点云节点时,如果该节点在视椎体内或者与视椎体相交,那就将节点读入内存交由gpu来绘制点,如果不在视椎体范围内的节点则不予绘制。基于视椎体区域判断节点,如图3所示。
[0076]
基于视点远近选择lod层级与根据遮挡剔除的可见性判断来显示节点两种调度策略相结合,有效提高了点云数据的调度效率,降低内存的占用率。
[0077]
步骤4包括:
[0078]
步骤41,为了减少在点云调度过程中,进行可视化分析所耗费的的时间。首先,即在点云的即时绘制过程中,为了保证有足够帧率,因此不直接将所有的节点读入,而是使用独立的一个线程去计算需要选择的节点后,进行在硬盘和内存之间进行自适应的灵活读取节点,达到渲染细节和可视化实时性的平衡。首先使用一个线程根据步骤3选择的节点从硬盘中读入内存,减少不必要的内存的占用。点的内存可视化节点存储容器vector_rendering进行边载入边删除。一方面,调度进程一直在持续根据步骤3的条件进行节点选择,对于符合要求的节点的点允许其一直待在vector_rendering中;而对于可视化过程中不符合规则的节点,则存入另一个二级内存临时存储容器vector_temp,并清除视化节点存
储容器vector_rendering以腾出空间容纳新来的点;在下一帧需要新的节点时,优先在vector_temp进行搜索,若存在需要的节点则直接存入vector_rendering,并在vector_temp中删除;若不存在,则在硬盘中读取相应节点。vector_temp在存储过程中如果超过限定的节点数,则删除最早存入的节点。此步骤大量的减少的节点在内外存反复读取的频率,提高了点云的可视化实时性。
[0079]
步骤42,单独的渲染进程则不断渲染vector_rendering中的点,两个进程同时进行,极大地提高了点云显示的流畅度,具体过程,如图4所示。
[0080]
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本发明的其它实施方案。本申请旨在涵盖本发明的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本发明的一般性原理并包括本发明中发明的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本发明的真正范围和精神由权利要求指出。
[0081]
以上仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,应视为本发明的保护范围。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1