1、八叉树构建原理
点云八叉树是在点云体素化或者二维格网化基础上(点云二维组织与体素化构建参考博客三维点云的格网(体素)组织_仰望星空_2022的博客-CSDN博客),再做进一步处理,将满足相同性质的点划入到同一块中,如同一体素内点能够拟合成面,或者来自同一地物等。
不管是二维格网还是三维体素构建八叉树,其原理步骤是相同的,都是以初始体素(或者格网)为处理基元,根据八叉树构建原理对其进行划分,实现构建。下面以体素块为例,讲解八叉树构建的思路。
一个正方体均匀划分成8个小立方体的形式如下(左图),包括两层,每一层包括四个立方体;所有级别体素及某一体素划分成八个子体素的示意图级别如右图所示。
每个体素构建八叉树的原理过程如下,其中判断是否继续划分的准则是属于该格网内的点是否能够拟合成平面,且点数要大于一定数量,若满足则不再继续划分,否则继续划分。具体的步骤如下:
(1)初始格网划分是否能够拟合成平面,且点数是否大于一定数量,(即level 0级内包含的点是否能够拟合成平面,且点数是否达到一定数量)
(2)若能够拟合成平面,则不划分该体素,停止;否则将该格网均匀划分成8个小立方体,并根据点的坐标划分到对应的小立方体内(即将level 0体素划分成8个level 1小立方体,同时将点依据坐标划入到对应的level 1小立方体内)
(3)对于得到的每个小立方体(level 1),按照步骤(1)(2)来执行,看是否继续划分,直至每个小块内点能够拟合成平面,或者点数小于设定的阈值为止。
因此,对体素点构建八叉树,是一个递归的过程,对每个体素采用划分规则对其进行划分,直至满足预先设定的条件。
在编写八叉树过程中,推荐使用C++中指针思想进行编写,适合与递归。基于C++编写的源码下载链接:机载LiDAR、车载、地基点云数据构建八叉树-算法与数据结构文档类资源-CSDN下载
代码使用说明:配置好PCL环境后,直接将cpp文件放入到工程中即可运行
2、效果图:
机载点云八叉树构建效果图:
在点云初始化中,同一块点云属性是不同的(无法拟合成面),在经过八叉树进一步划分后,同一块点云的属性相同。
地基点云构建的八叉树如下:
对点云仅进行体素化时,位于面片相交处的点被划入到一个体素内,实际该体素内包含来自多个面的点,在有些场合是不合理的(如平面分割),在经过八叉树进一步处理后,属于同一块能较好拟合成平面,是有利于后续分割。
写在最后:
点云体素、八叉树构建等均属于数据预处理过程,划分准则根据需要来设置。