八叉树(Octree)是一种用于描述三维空间的树状数据结构。八叉树的每个节点表示一个正方体的体积元素,每个节点有八个子节点,这八个子节点所表示的体积元素加在一起就等于父节点的体积。
- 一般中心点作为节点的分叉中心。
- 八叉树若不为空树的话,树中任一节点的子节点恰好只会有八个,或零个,也就是子节点不会有0与8以外的数目。
- 分割一直要进行到节点所对应的立方体或是完全空白,或是完全为V占据,或是其大小已是预先定义的体素大小,并且使体素认为是空白的,或认为是V占据的。
1. Octree可以用于点云压缩
2. 使用八叉树进行空间分区和搜索操作
octree.nearestKSearch(searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance)
K近邻搜索 方法把搜索结果写到两个分开的向量
- 第一个pointIdxNKNSearch包含搜索结果 (结果点的索引的向量)
- 第二个向量pointNKNSquaredDistance存储搜索点与近邻之间的距离的平方
空间划分
octree是一种管理稀疏3D数据的树状结构,利用octree实现多个无序点云之间的空间变化检测,这些点云可能在尺寸、分辨率、密度和点顺序等方面有所差异,通过递归的比较octree的树结构,可以鉴定出由octree产生的体素组成的区别所代表的空间变化
体素邻近搜索,查询点所在体素中其他点的坐标作为查询结果返回
3. 无组织点云数据的空间变化检测
// 初始化空间变化检测对象
pcl::octree::OctreePointCloudChangeDetector<pcl::PointXYZ> octree(resolution);
// 添加点云A到八叉树中,构建八叉树
octree.setInputCloud(cloudA); //设置输入点云
octree.addPointsFromInputCloud(); //从输入点云构建八叉树
// 添加cloudB到八叉树中
octree.setInputCloud(cloudB);
octree.addPointsFromInputCloud();
// newPointIdxVector 获取前一cloudA对应八叉树在cloudB对应在八叉树中没有的点集
octree.getPointIndicesFromNewVoxels(newPointIdxVector);
具体代码见03Octree · 语雀