一种基于八叉树的散乱点云压缩方法与流程

文档序号:12675533阅读:356来源:国知局
一种基于八叉树的散乱点云压缩方法与流程

本发明属于计算机辅助设计和点云处理领域,尤其是涉及一种针对散乱点云的压缩方法。



背景技术:

随着点云处理技术、现代光学技术、激光扫描等技术飞速发展,点云数据已经在计算机辅助设计和图形学领域有了广泛应用。而随着扫描仪器精度的提高,获取的点云级数越来越大,存储和传输点云的速度变慢,为了处理这类问题,点云数据的压缩变得愈加重要。并且在实际操作中,利用三维系统获取点云时,由于设备精度、操作者经验、环境因素等带来的影响以及被测物体表面变化和数据拼接配准操作过程的影响,点云数据将出现一些噪声点,在实际测量中,除了测量随机误差产生的噪声点之外,受到外界干扰如视线遮挡、障碍物等因素的影响,点云数据往往存在一些离主体点云即被测物体点云较远的离散点,即离群点。不同的获取设备点云噪声结构也有不同(利用光栅系统获取点云时,在光栅无法投影的区域以及在点云重建阶段的计算误差会引发产生噪声点)。

由于原始点云中离群点的干扰,会使得点云的处理变得困难。目前,离群点移除受到了国内外很多研究人员的重视,提出了基于局部点云特征移除方案,针对采样点处法向量或曲率变化率做运算,运算很复杂,很有可能导致错误的数值,反过来引发点云后期处理的失败。本文针对每个点的邻域做分析,采用统计的方法修剪掉那些不符合一定标准的点。



技术实现要素:

本发明所要解决的技术问题在于克服现有技术的不足,本发明提出了一种基于八叉树的散乱点云压缩方法。

本发明采用的技术方案如下:

一种基于八叉树的散乱点云压缩方法,基于离散无序点云,具体步骤如下:

步骤1:八叉树分割:根据读入点云数据划分包围盒,依照划分停止公式进行八叉树划分;

步骤2:离群点移除:在步骤1分割的基础上建立k邻域,在八叉树最深处叶子节点分配位掩码,根据点的邻域的统计分析和位操作移除离群点,其中,该稀疏离群点移除方法基于在输入数据中对点到邻近点的距离分布的计算;

步骤3:点位置细节编码;对于每个体素所占有的点做处理;在执行序列化的同时,利用广度优先遍历查询和编码点的局部细节,对含有超过一个点的体素,计算点和体素中心间的拓扑关系,产生与各自体素中心相关的位置细节参数流并存储,在解码时还原拓扑关系;

步骤4:区间编码,将处理后的点云压缩数据写至一个文件中或者直接由数据流进行传输。

进一步的,步骤1具体步骤如下:

1.1:在读入点云数据之时,记录X,Y,Z三个维度的最值xmin,xmax,ymin,ymax,zmin,zmax

1.2:根据步骤1.1中得到的最值坐标,根据式(1)构造出包围盒Cube;

其中(x=(xmax-xmin),y=(ymax-ymin),z=(zmax-zmin));Vcube为包围盒体积,edge为包围盒的边长;

1.3:以构造的包围盒Cube为划分对象,根据分割停止标准划分最小包围盒Cubemin,其中分割停止标准建立基于叶子节点/点云比率、八叉树分辨率λ、层数之间的关系,计算点云总数和非空节点之间的差值与点云总数的比值,即为在划分过程中所产生的一定精度损失率t;

P表示在当前层次深度中最小包围盒的数量,M为点云中点的数量,λ为八叉树分辨率,λ1为扫描仪精度,t为精度损失率,n为层数,当调节分辨率λ的时候,确保t在(0,0.1]之间;

1.4:判断步骤1.3中得到最小包围盒Cubemin的个数是否均满足精度损失率t要求,如果满足,则卦限不需要继续细分并跳至步骤1.5;否则继续将该卦限进行八等分,直到所有卦限内最小包围盒Cubemin个数均满足精度损失率t的要求;

1.5:对步骤1.4中获取的所有细分卦限,判断每个卦限内点云数量是否均不小于1;如果是,则点云模型空间划分结束。

进一步的,步骤2具体包括以下步骤:

2.1:在完成逐层划分之后,对数据编码,通过八叉树对每个数据搜索其邻域点,找到最近的k个点作为k邻域;

2.2:在步骤2.1的基础上,对每个点的k邻域进行一个统计分析;稀疏离群点移除方法基于在输入数据中对点到邻近点的距离分布的计算;对每个点,计算它到域中所有邻近点的均值μ和标准差σ,去除超出u±a·σ的点,a的值取决于被分析k邻域的尺寸;

2.3:设节点N的位掩码表示为SN,遍历查询的离群点K的位掩码表示为SK,SN的长度为8,设给定节点SN=1表示节点包围盒至少有一个点,SN=0表示包围盒为空,设Nn为新八叉树Sn的根部,当判断Sn没有遍历至底端时,Nn赋值为有遍历顺序Sn的非空节点,如果Sn的节点Nn满足NK一样的离群点条件则SK=bitewiseAND(SK,0),否则初始化一个Sn的新的节点N并把其当作当前区域新的根部位掩码其中bitewiseAND为按位与操作。

进一步的,步骤4具体包括以下步骤:

4.1:形成频率表:区间长度为s,设有一整数区间i∈[L,H),其中:L为区间下沿,H为区间上沿,区间范围R=H-L+1;T为符号S的总计频率,fs为符号S的频率,令Fs为符号S的累计频率,该累计频率是符号小于S的其他符号的频率总和

4.2:设Ai是信息中的第i个想要编码的字母,1≤i≤k,根据步骤4.1的频率表选择s大小的区间长度编码A1,留下R1的区间长度编码A2,留下R2的区间长度编码A3,依次类推。

进一步的,所述步骤2.1中,对于非空叶子节点查询其立方体的数据点和周围26个叶子节点立方体中的数据点并找到最近的k个点作为k邻域,如果邻域内点的个数不足k个,则扩大搜索范围至124个叶子节点立方体中的数据点查找,最终完成k邻域的建立。

进一步的,所述步骤2还包括根据八叉树的编码特点,点云坐标P(x,y,z)和树中节点(a,b,c)相对应且树中任一个节点都与一个最小包围盒Cubemin一一对应;节点的编码为M=mn-1…m2m1m0,mn-1为结点在n层的节点序号;

利用空间坐标计算出节点索引值,其中,λ为八叉树分辨率,

其编码可用二进制表示:

节点序号mi和ai,bi,ci之间的关系可表示为:

mi=ai+bi·2+ci·4 (5)

ai=(mi mod2),bi=[(mi/2)mod2],ci=[(mi/4)mod2] (6)

其中:mod为取模运算符,利用公式5、6可以由点包围盒邻接的立方体得出节点在树中的编码,即可从根节点沿路径检测出节点,按此规则,在A搜索出距离最近的k个点,得到点A的k邻域N|A|。

进一步的,所述步骤4.1中区间长度的计算公式为,

其中:T为符号S的总计频率,fs为符号S的频率,Fs为符号S的累计频率;

如果在区间长度s上的完整范围是[Bk,Bk+Rk),当Rk小于一定阈值的时候,从[Bk,Bk+Rk)中提取一个数值来表示整个压缩数据,其中,Bj是区间下沿的计算公式,Ri是区间长度的计算公式,Bk,Rk表示当满足一定阈值要求时的区间下沿和区间长度。

有益效果:本发明公开了一种针对散乱点云的压缩方法,所述方法针对无任何预知信息下的三维点云数据。本发明的方法改进了八叉树分割的停止条件,可以在适当的深度停止分割并确保体素大小合适;在分割的基础上建立k邻域,利用简单有效的统计方法去除原始点云的离群点;而在数据结构上,对每个节点分配位掩码,通过操纵位掩码,在遍历时对数据查询和操作,并优化随后的点位置编码。该方法有效的移除了离群点和表面杂点,并在区间编码提高了点云压缩效率。

附图说明:

图1是本发明的一种针对散乱点云的压缩方法整体流程图。

图2是本发明使用的人脸点云模型和泡沫点云模型。

图3是步骤1中不同t值的点云分割的效果图。

图4是步骤2中离群点移除的效果图。

图5是步骤3中点细节编码的示意图。

具体实施方式:

下面结合附图,对本发明提出的一种针对散乱点云的压缩方法进行详细说明。

本实施例在Windows操作系统中通过VS2012平台用C++编程语言实现基于八叉树的点云压缩方法的全部过程。选取采用光栅投影三维测量技术所获得的人脸和泡沫点云数据,点云模型如图2所示,以此作为实例,基于本发明提出的方法对三维散乱点云进行处理。图1是本发明方法整体流程图,具体步骤如下:

步骤1:八叉树分割,根据读入点云数据划分包围盒,其具体步骤如下:

步骤1.1:在读入点云数据之时,记录X,Y,Z三个维度的最值Xmin,Xmax,Ymin,Ymax,Zmin,Zmax

步骤1.2:分别根据步骤1.1中得到的最值坐标后构造出包围盒Cube。

其中(x=(xmax-xmin),y=(ymax-ymin),z=(zmax-zmin));Vcube为包围盒体积,edge为包围盒的边长。

基于叶子节点/点云比率与λ之间以及层数之间的关系建立分割停止标准,当八叉树分辨率λ设定之后,八叉树叶子节点所在层数n也已经确定,按层遍历八叉树;计算 点云总数和非空节点(即最小包围盒)之间的差值与点云总数的比值,表示在划分过程中所产生的一定精度损失率t,一旦精度损失率t确定,八叉树分辨率λ便也随之确定,一般实验室取精度损失率t∈(0,0.1],如图3所示,为不同情况下的精度损失率t所对应的划分情况,图3(d)的精度损失率t满足取值条件。

P表示在当前层次深度中最小包围盒的数量,M为点云中点的数量,λ为八叉树分辨率,λ1为扫描仪精度,t为精度损失率,当调节分辨率λ的时候,确保t在(0,0.1]之间。

步骤1.3:以构造的包围盒Cube为划分对象,划分最小包围盒Cubemin

步骤1.4:判断步骤1.3中得到最小包围盒Cubemin的个数是否均满足t要求,如果是,则卦限不需要继续细分并跳至步骤1.5;否则继续将该卦限进行八等分,直到所有卦限内最小包围盒Cubemin个数均满足精度损失率t的要求。

步骤1.5:对步骤1.4中获取的所有细分卦限,判断每个卦限内点云数量是否均不小于1;如果是,则点云模型空间划分结束。

步骤2:离群点移除,在分割的基础上,建立k邻域,并在八叉树最深处叶子节点分配位掩码,根据点的邻域的统计分析和位操作移除离群点,如图4所示,原始点云共24673个点,移除274个离群点,为了显示明显,将点的大小扩大了一倍。

步骤2.1:在完成逐层划分之后,对数据编码,然后通过八叉树对每个数据搜索其邻域点;对于非空叶子节点查询其立方体的数据点和周围26个叶节点立方体中的数据点并找到最近的k个点作为k邻域;如果邻域内点的个数不足k个,则扩大搜索范围至124个立方体查找,最终完成k邻域的建立;

步骤2.2:根据八叉树的编码特点,点云坐标P(x,y,z)和树中节点(a,b,c)相对应且树中任一个节点都与一个最小包围盒Cubemin一一对应;节点的编码为M=mn-1…m2m1m0,mn-1为节点在n层的节点序号。

首先利用空间坐标计算出节点索引值:

其编码可用二进制表示:即

节点序号mi和ai,bi,ci之间的关系可表示为:

mi=ai+bi·2+ci·4 (5)

若知道八叉树某一节点序号mi,利用mi和ai,bi,ci之间的关系得出:

ai=(mi mod2),bi=[(mi/2)mod2],ci=[(mi/4)mod2] (6)

注:mod为取模运算符,利用上述公式可以由点A包围盒邻接的立方体求出节点在树中的编码,即可从根节点沿路径检测出节点,按此规则,在A搜索出距离最近的k个点,得到点A的k邻域N|A|。

步骤2.3:在步骤2.1,2.2的基础上,对每个点的k邻域进行一个统计分析,稀疏离群点移除方法基于在输入数据中对点到邻近点的距离分布的计算,对每个点,计算它到域中所有邻近点的平均距离;假设得到的结果呈高斯分布,形状由均值μ和标准差σ决定,平均距离在标准范围(由全局距离平均值μ和方差σ定义)之外的点,可以被定义为离群点并可从数据集中去除掉,计算最近邻域距离的均值μ和标准差σ并且去除超出u±a·σ的点,离散点去除模型来更正这些不规整。a的值取决于被分析k邻域的尺寸。

步骤2.4:设节点N位掩码表示为SN,遍历查询的离群点K位掩码表示为SK。位掩码SN的长度为8;如果在给定节点N位掩码SN=1表示节点包围盒至少有一个点,SN=0表示包围盒为空。设Nn为新八叉树Sn的根部,当判断Sn没有遍历至底端时,Nn赋值为有遍历顺序Sn的非空节点,如果Sn的节点Nn满足NK一样的离群点条件则SK=bitewiseAND(SK,0),否则初始化一个Sn的新的节点N并把其当作当前区域新的根部位掩码其中bitewiseAND为按位与操作。

步骤3:点位置细节编码;为了提高解压精度,对于每个体素所占有的点做处理。在执行序列化的同时,利用广度优先遍历查询和编码点的局部细节,对含有超过一个点的体素,计算点和体素中心间的拓扑关系,产生与各自体素中心相关的位置细节参数流并存储,在解码时还原拓扑关系,点细节编码如图5所示;

步骤4:区间编码,对上述步骤所产生的输出流经区间编码输入:

步骤4.1:区间长度为s,设有一整数区间i∈[L,H),L为区间下沿,H为区间上沿,区间范围R=H-L+1。T为符号S的总计频率,fs为符号S的频率,令Fs为符号S的累计频率,累计频率是符号小于S的其他符号的频率总和

步骤4.2:假设Ai是信息中的第i个我们想要编码的字母,1≤i≤k。根据频率表选择区间大小为s的长度编码A1,留下R1的区间长度编码A2,留下R2的区间长度编码A3,以此类推。

步骤4.3:区间长度的计算公式为:

如果在长度s上的完整范围是[Bk,Bk+Rk),当Rk小于一定阈值的时候,从[Bk,Bk+Rk)中提取一个数值来表示整个压缩数据。

步骤5:输出的点云压缩数据被写至一个文件中或者直接由数据流进行传输。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1