PCL学习笔记4-Octree

 八叉树(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 · 语雀

猜你喜欢

转载自blog.csdn.net/luoyihao123456/article/details/125249015