点云数据的存储方法及装置与流程

文档序号:12719997阅读:394来源:国知局
点云数据的存储方法及装置与流程

本发明涉及计算机信息技术领域,具体涉及一种点云数据的存储方法及装置。



背景技术:

云点数据是指扫描资料以点的形式记录,每一个点包含有三维坐标,有些可能含有颜色信息(RGB)或反射强度信息(Intensity)。通常在进行扫描时获得的数据会根据扫描的空间大小呈几何增长,因此通过计算机进行点云数据的存储、查询、读取等操作通常需要大量的计算,时效性很差。



技术实现要素:

针对现有技术中的缺陷,本发明提供的点云数据的存储方法及装置,降低了点云数据的存储量,提高了点云数据的读取、查询、渲染效率。

第一方面,本发明提供的一种点云数据的存储方法,包括:计算点云数据的包围盒;按照八叉树结构对所述包围盒进行递归切分,所述八叉树结构的每个层级对应一个点距;在每次切分后,根据当前层级的点距判断切分得到的每个子单元空间内的点是否属于当前层级,以文件的形式存储属于当前层级的点的信息,其中,切分得到的每个子单元空间对应当前层级内的一个节点,每个节点对应一个文件。

本实施例提供的点云数据的存储方法,从根节点到所有的中间节点以及叶节点,每个节点对应的文件中都包含点数据,且所有文件中没有重复的点,解决了点云数据分布不均匀时,等距分割后各个子单元空间内包含点的数量差异很大的问题。降低了数据存储的冗余量,节省了存储空间。按点距逐层存储的方式,在加载和渲染时可以按照需要显示的精度逐层调度,随着加载和渲染的节点数越多,渲染出来的效果就更好。

优选地,还包括:根据点云总数和所述包围盒的体积确定根节点的点距;根据根节点的点距逐层确定每个层级的点距,下一层级的点距小于上一层级的点距。

优选地,所述根据根节点的点距逐层确定每个层级的点距,包括:下一层级的点等于小于上一层级的点距的一半。

优选地,所述根据当前层级的点距判断切分得到的每个子单元空间内的点是否属于当前层级,包括:根据当前层级的点距将子单元空间网格化;遍历子单元空间内的点,根据点的位置信息判断点所处的网格,若所述网格未被占据,则确定该点属于当前层级且标记所述网格被占据;若所述网格已被占据则该点放到下一层级进行判断。

优选地,在每次切分后,还包括:判断当前层级是否小于预设的最大分割深度;若当前层级大于等于预设的最大分割深度,则终止切分;若当前层级小于预设的最大分割深度,则对切分得到的每个子单元空间分别进行如下操作:判断子单元空间内的点的数量是否小于预设的最少包含点数,若小于,则终止对所述子单元空间的切分。

优选地,所述以文件的形式存储属于当前层级的点的信息,包括:以Lob格式文件存储属于当前层级的点的信息。

优选地,所述文件以分层的结构进行存放,为满足分层要求的节点建立文件夹,所述文件夹中包括该节点的文件,该节点在当前层内所有子节点的文件,一个索引文件;所述索引文件包含所述文件夹中所有节点的索引以及每个节点包含的点的数量;若所述文件夹中最大层级的节点还包括子节点,则所述文件夹中还包括下一层文件夹。

第二方面,本发明提供的一种点云数据的存储装置,包括:包围盒计算模块,用于计算点云数据的包围盒;递归切分模块用于,按照八叉树结构对所述包围盒进行递归切分,所述八叉树结构的每个层级对应一个点距;数据存储模块,用于在每次切分后,根据当前层级的点距判断切分得到的每个子单元空间内的点是否属于当前层级,以文件的形式存储属于当前层级的点的信息,其中,切分得到的每个子单元空间对应当前层级内的一个节点,每个节点对应一个文件。

本实施例提供的点云数据的存储装置,从根节点到所有的中间节点以及叶节点,每个节点对应的文件中都包含点数据,且所有文件中没有重复的点,解决了点云数据分布不均匀时,等距分割后各个子单元空间内包含点的数量差异很大的问题。降低了数据存储的冗余量,节省了存储空间。按点距逐层存储的方式,在加载和渲染时可以按照需要显示的精度逐层调度,随着加载和渲染的节点数越多,渲染出来的效果就更好。

优选地,还包括点距计算模块,用于:根据点云总数和所述包围盒的体积确定根节点的点距;根据根节点的点距逐层确定每个层级的点距,下一层级的点距小于上一层级的点距。

优选地,所述点距计算模块中,根据根节点的点距逐层确定每个层级的点距,包括:下一层级的点等于小于上一层级的点距的一半。

附图说明

图1为本发明实施例所提供的点云数据的存储方法的流程图;

图2为按八叉树结构进行切分的示意图;

图3为不同层级的节点单独、组合渲染的效果图;

图4为按八叉树结构进行递归切分的一个示例;

图5为节点文件以分层的结构进行存放的一个示例;

图6为本发明实施例所提供的点云数据的存储装置的结构框图。

具体实施方式

下面将结合附图对本发明技术方案的实施例进行详细的描述。以下实施例仅用于更加清楚地说明本发明的技术方案,因此只是作为示例,而不能以此来限制本发明的保护范围。

需要注意的是,除非另有说明,本申请使用的技术术语或者科学术语应当为本发明所属领域技术人员所理解的通常意义。

如图1所示,本实施例提供的一种点云数据的存储方法,包括:

步骤S1,计算点云数据的包围盒。

其中,包围盒为能够包含所有点云数据且体积最小的几何体,如球体、立方体等。最常见的包围盒算法有AABB包围盒(Axis-aligned bounding box),包围球(Sphere),方向包围盒OBB(Oriented bounding box)以及固定方向凸包FDH(Fixed directions hulls或k-DOP)。为适应八叉树结构的切分,本实施例优选采用AABB包围盒的算法,该算法为本领域通用的算法,在此不再赘述。

步骤S2,按照八叉树结构对包围盒进行递归切分,八叉树结构的每个层级对应一个点距。

其中,八叉树结构是四叉树结构在三维空间中的扩展,是一种描述和检索三维立体空间的有层次性的树状结构。以包围盒为八叉树结构的根节点,将包围盒切分为八个子单元空间,得到第一层级的八个节点,并为每个子单元空间进行编号,编号是为了区分开每个子单元空间,确定每个子单元空间的空间位置,切分方式参见图2,对每个子单元空间再按照上述方式进行切分,直到满足递归切分的终止条件。八叉树结构中的每一个节点对应切分得到的一个子单元空间。

其中,点距为每个层级中点与点的最小距离,点距可以表示层级中点的系数程度。下一层级的点距小于上一层级的点距,以此达到逐层提高数据精度的目的。

步骤S3,在每次切分后,根据当前层级的点距判断切分得到的每个子单元空间内的点是否属于当前层级,以文件的形式存储属于当前层级的点的信息,其中,切分得到的每个子单元空间对应当前层级内的一个节点,每个节点对应一个文件。

其中,属于当前层级的点在下一层级的切分过程中不会再参与判断。对于不属于当前层级的点,在下一层级的切分过程中再进行判断。

其中,点的信息包括点在三维空间中的坐标,还可以包括点的颜色信息或反射强度信息等。

其中,对于不再进行切分的节点不会建立其节点下的子文件,对于不包含点的节点不会建立对应的文件,这样可以减少文件的存储量,在加载调用数据时提高检索的效率。

本实施例提供的点云数据的存储方法,从根节点到所有的中间节点以及叶节点,每个节点对应的文件中都包含点数据,且所有文件中没有重复的点,解决了点云数据分布不均匀时,等距分割后各个子单元空间内包含点的数量差异很大的问题。降低了数据存储的冗余量,节省了存储空间。按点距逐层存储的方式,在加载和渲染时可以按照需要显示的精度逐层调度,随着加载和渲染的节点数越多,渲染出来的效果就更好。

为了确定各个层级的点距,本实施例提供的方法还包括:根据点云总数和包围盒的体积确定根节点的点距,根据根节点的点距逐层确定每个层级的点距,下一层级的点距小于上一层级的点距。

其中,点云总数为包围盒中点的总数量。根据点云总数和包围盒的体积确定根节点的点距的具体方法为:获取点云总数并计算包围盒的体积,包围盒的体积除以点云总数获得单个点的平均体积,将单个点的平均体积开三次方根得到根节点的点距。如,包围盒的体积为1立方米,点云总数为1000个点,则为每立方分米含一个点,点距为一分米,即0.1米。当然,在计算点距的过程中,可以根据实际需求乘上系数,以选取合适的点距。

其中,根据根节点的点距逐层确定每个层级的点距,包括:下一层级的点等于小于上一层级的点距的一半。例如,根节点中点间距为1.0,则它的子节点(即根节点的下一层级)的点距为0.5,具体参见图3,其中(a)为根据根节点中的点进行渲染的效果,(b)为根节点的一个子节点中的点进行渲染的效果,从图中明显可看出,层级越低点云数据的渲染越粗糙,层级越高加载和渲染的点越多,渲染出来的效果就更好,图3中(c)和(d)为将根节点和子节点组合在一起时的渲染效果。

在上述任意方法实施例的基础上,步骤S3中,根据当前层级的点距判断切分得到的每个子单元空间内的点是否属于当前层级,包括:对切分得到的每个子单元空间分别进行如下操作:

步骤S31,根据当前层级的点距将子单元空间网格化。

其中,网格化是指将子单元空间划分为多个以点距为边长的立方体。

步骤S32,遍历子单元空间内的点,根据点的位置信息判断点所处的网格,若该网格未被占据,则确定该点属于当前层级且标记网格被占据;若该网格已被占据则该点放到下一层级进行判断。

其中,步骤S32本质上是在每个网格中选取一个点作为当前层级的点进行存储,为了提高处理效率,不需要遍历子单元空间内的所有点,只需遍历每个网格,从网格中选取一个点即可。

八叉树的切分是一个递归过程,需要设置终止条件或分割限制因素,在每次切分后,还需判断是否满足递归切分的终止条件,在上述任意方法实施例的基础上,判断是否满足递归切分的终止条件具体包括:

步骤S10,判断当前层级是否小于预设的最大分割深度。

其中,八叉树作为一种树结构,树的深度即进行分割的次数。最大分割深度为切分的最大层级。

步骤S20,若当前层级大于等于预设的最大分割深度,则终止切分。

步骤S30,若当前层级小于预设的最大分割深度,则对切分得到的每个子单元空间分别进行如下操作:判断子单元空间内的点的数量是否小于预设的最少包含点数,若小于,则终止对子单元空间的切分。

其中,最少包含点数为单个子单元空间内所包含的最少点数,即设最少包含点数为N,当子单元空间中的点的数量小于等于N时,就终止对该子单元空间的切分,否则,继续对其进行切分。

上述两个切分终止条件适用于子单元空间中没有点的情况,对没有点的空节点的继续切分是无意义的,对所有没有包含点的节点我们都把它解读为空,不生成文件进行存储,这样可以对存储的数据进行压缩。由于点云数据只是物体的表面,并且通常每次只是对单一角度的物体进行测量测距,这就使得大部分空间都是空的,所以,多数的八叉树的节点也将只有个别的子节点。通过同时定义切分的两个终止条件,可以避免创建一个完全八叉树,即一个八叉树中的所有叶节点都在同一层,并且所有的其余节点都有八个子节点。因些,采用上述两种终止条件后,减少了数据存储量,提高了点云数据的存储效率和检索效率。其中,叶节点指不包含子节点的节点。图4为按八叉树结构进行递归切分的一个示例,一共切分了两次,共切分为三层,在空间中有点数据的部分用灰色表示,没有点数据的部分用白色表示,结构树中只保留包含点数据的节点。

为了进一步压缩数据的存储量,在上述任意方法实施例的基础上,步骤S3中,以文件的形式存储属于当前层级的点的信息的优选实施方法包括:以Lob格式文件存储属于当前层级的点的信息。Lob格式文件采用二进制流的形式存储点云数据的信息,降低数据体积,加快数据的存储和访问速度。另外,对于大多数数据而言,2个byte已经足以表达数据的精度,同时还能表示点的其它信息,如向量等,所以本实施例选择只用2个byte来存储每个点的坐标,并以Lob格式进行存储。

点云数据在存储过程中会建索引文件,方便节点的查找。为了减少索引文件,提高检索效率,在上述任意方法实施例的基础上,文件以分层的结构进行存放,为满足分层要求的节点建立文件夹,文件夹中包括该节点的文件,该节点在当前层内所有子节点的文件,一个索引文件;索引文件包含该文件夹中所有节点的索引以及每个节点包含的点的数量;若该文件夹中最大层级的节点还包括子节点,则该文件夹中还包括下一层文件夹。

其中,文件层次结构的深度取决于所采用的分层步距的值。分层要求规定了每间隔多少个层级进行分层(即为对应的节点建立文件夹),分层步距为分层的间隔层级数,若分层步距为5,则每间隔5个层级分为一层,文件夹中存储节点以及节点下5个层级的子节点的信息,文件夹的index文件记录了6个层级的层次结构(自身节点和接下来的5个层级)。

其中,八叉树的一个节点包括8个子节点,这8个子节点的编号分别为0、1、2、3、4、5、6、7,具体编号的顺序可自行定义,一旦确定编号顺序,则所有子节点的编号都按该顺序进行。对于每一个八叉树的节点,是以它所在的层级以及在其父节点中的编号命名文件的,例如:文件名为l表示是根节点(对应第零层级,该层级只包含一个根节点),文件名为l0表示根节点的第一个子节点(对应第一层级),文件名为l03表示根节点的第一个子节点的第四个子节点(对应第三层级)。如图5所示,所有节点对应的文件均按照分层步距以分层的结构存放在data目录下。

其中,index文件(索引文件)中每个索引的长度为5bytes(字节),1byte用来描述这个节点包含的子节点,例如:l.index文件中00000011指包含当前节点的第0个子节点和第1的子节点;另外4bytes用来存储该节点中点的数量。

其中,index文件中按照深度优先的方式存放每个节点的索引,即按照树结构先存储一条支路上的所有节点直到叶节点,然后再存储下一条支路的节点。

如图4所示,假设点云总数是100000,为方便描述,设根节点名称为l。

第一级中:

节点l1包含10000个点,节点l4包含50000个点,节点l7包含40000个点。

第二级中:

节点l1的子节点l11包含3000个点,节点l1的子节l14包含7000个点。

节点l4的子节点l41包含10000个点,子节点l44包含20000个点,子节点l45包含20000个点。

节点l7的子节点l77包含40000个点。

下面以图4为例,说明index文件的存储方式。假设分层步距为5,则所有的节点都存储在根节点的文件夹中,所有节点的关系都按照深度优先的方式存放在index文件当中,则index文件存储的信息为:

10010010 000000000000000000000000000100000(对应节点l)

00010010000000000000000000000000000010000(对应节点l1)

00000000000000000000000000000000000003000(对应节点l11)

00000000000000000000000000000000000007000(对应节点l14)

00110010000000000000000000000000000050000(对应节点l4)

00000000000000000000000000000000000010000(对应节点l41)

00000000000000000000000000000000000020000(对应节点l44)

00000000000000000000000000000000000020000(对应节点l45)

10000000000000000000000000000000000010000(对应节点l7)

00000000000000000000000000000000000040000(对应节点l77)

上述是为了方便理解才采用这样的格式进行表述,实际存储时index文件中是数据是没有任何格式和注释的。

假设分层步距为5,以分层的结构进行存放的步骤为:首先,为根节点(即第零层级)建立文件夹,为方便描述命名为文件夹l,将根节点及其以后的5个层级中所有节点的文件存储在文件夹l中,同时文件夹l中包含一个索引文件,该索引文件用于存储文件夹l中所有节点的索引以及每个节点包含的点的数量。接着,若文件夹l中的第五层级的节点存在子节点,则在文件夹l中建立该节点对应的文件夹,以该子节点的文件名进行命名,如,该节点的文件名为l02666,则对应的文件夹的名称为l02666;文件夹l02666中包含:节点l02666以及节点l02666下5个层级的子节点的文件,一个索引文件;该索引文件用于存储文件夹l02666中所有节点的索引以及每个节点包含的点的数量。以此类推,直达所有节点都存储到对应的文件夹中。

如果点云数据量偏小,切分到最精细的层级还未满足分层要求时,点云的密度已经能够控制在点量的限制范围内,则无需继续往下切分。对于数据量极大的点云,切分到层级已经满足分层要求,但此时节点所包含的数据量仍然非常大,则还需要对节点进行切分,这个时候会创建一个文件夹,它下面的节点对应的lob文件保存在这个文件夹下,并且为这个节点构建index文件。所以对数据量偏小的点云来说,处理的最终能够结果是只有一个存放在根节点的index文件,而对于海量的点云数据会有多个index文件,分别存放在满足分层要求的节点下。这种分层建立索引的方式,减少了索引文件数量,有助于提高检索效率。

点云数据处理完毕之后,所有节点的关系都按照深度优先的方式放在index文件当中,调用数据的时候,直接读取index文件,每五个字节就是一个节点信息,根据这个信息就清晰地知道它下面的子节点信息,构建出节点的关系树结构,而不用采用遍历的方式查找很多遍,大大提索引的检索效率。渲染层可以根据不同的渲染显示机制做相应的控制,什么情况渲染哪个节点数据。渲染层一般根据当前视点位置和距离,判断应该渲染哪个层级的节点。

基于与上述点云数据的存储方法相同的发明构思,本实施还提供了一种点云数据的存储装置,如图6所示,包括:包围盒计算模块,用于计算点云数据的包围盒;递归切分模块用于,按照八叉树结构对包围盒进行递归切分,八叉树结构的每个层级对应一个点距;数据存储模块,用于在每次切分后,根据当前层级的点距判断切分得到的每个子单元空间内的点是否属于当前层级,以文件的形式存储属于当前层级的点的信息,其中,切分得到的每个子单元空间对应当前层级内的一个节点,每个节点对应一个文件。

本实施例提供的点云数据的存储装置,从根节点到所有的中间节点以及叶节点,每个节点对应的文件中都包含点数据,且所有文件中没有重复的点,解决了点云数据分布不均匀时,等距分割后各个子单元空间内包含点的数量差异很大的问题。降低了数据存储的冗余量,节省了存储空间。按点距逐层存储的方式,在加载和渲染时可以按照需要显示的精度逐层调度,随着加载和渲染的节点数越多,渲染出来的效果就更好。

其中,还包括点距计算模块,用于根据点云总数和包围盒的体积确定根节点的点距;根据根节点的点距逐层确定每个层级的点距,下一层级的点距小于上一层级的点距。

其中,点距计算模块中,根据根节点的点距逐层确定每个层级的点距,包括:下一层级的点等于小于上一层级的点距的一半。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围,其均应涵盖在本发明的权利要求和说明书的范围当中。

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