前面已经简单讲解了八叉树的原理和PCL Octree模块的使用代码,链接为:
https://blog.csdn.net/CFH1021/article/details/121499140?spm=1001.2014.3001.5501
原理和应用事例已经说明过了,毕竟Octree是PCL的一个模块,内容还是挺多的,特别是涉及到里面的类也有很多,那么今天就简单的说明一下:
类Octree2BufBase实现了同时存储管理两个八叉树于内存中,因此,可以非常高效地实现八叉树的建立管理等操作,并且该类实现对邻近节点结构的变化探索,对应到空间点云,其就可以面对空间曲面的动态变化进行探索,在进行空间动态变化探索中非常有用,例如基于kinect设备的体感交互作用。
序号 | 函数名称 | 解释说明 |
---|---|---|
1 | setMaxVoxelIndex | 设置各维度上支持的最大体素格个数 |
2 | setTreeDepth | 设置八叉树的最大深度,需要在初始化八叉树时进行设置 |
3 | createLeaf | 创建一个新的叶节点 |
4 | findLeaf | 根据坐标信息查找相应的叶节点,存在返回该节点指针,不存在返回nullptr |
5 | existLeaf | 判断xyz对应的叶节点是否存在,不存在返回false,存在返回true |
6 | removeLeaf | 删除xyz对应的叶节点 |
7 | getLeafCount | 获取八叉树中的叶节点的数目 |
8 | getBranchCount | 获取八叉树的分支数目 |
9 | deleteTree | 删除当前的八叉树 |
10 | deletePreviousBuffer | 删除另一个缓冲区中对应八叉树的结构及其叶节点 |
11 | deleteCurrentBuffer | 删除当前缓冲区中对应的八叉树结构及其叶节点 |
12 | switchBuffers | 交换缓冲区,并重新设置八叉树结构 |
13 | serializeTree | 序列化八叉树结构到std::vector中,do_XOR_encoding_arg设置输出时是否将前缓冲区和后缓冲区中数据进行异或操作后再输出,异或操作是两个八叉树结构之间差异数据的输出 |
14 | serializeTree | 序列化函数重载,其中参数leaf_container_vector_arg用于存储八叉树中叶节点上的数据,其余参数同上 |
15 | serializeLeafs | 序列化重载,leaf_container_vector_arg用于存储八叉树中叶节点上的数据,该函数只序列化八叉树中的数据 |
16 | serializeNewLeafs | 序列化当前缓冲区八叉树中存在但在后缓冲区八叉树中不存在的点数据 |
17 | deserializeTree | 反序列化,将容器中的点云数据反序列到当前缓冲区的八叉树中 |
18 | switchBuffers | 反序列化,将容器中的点云数据反序列到当前缓冲区的八叉树中 |
类OctreeBase为八叉树的基类,其关键函数可参考上文。
类OctreeContainerBase为八叉树的容器类,是八叉树叶节点的基类。
序号 | 函数名称 | 解释说明 |
---|---|---|
1 | addPointIndex | 将一个点的index添加到该容器对象中,仅支持单点index存储 |
2 | getPointIndex | 获取容器中点的index |
3 | getPointIndices | 获取容器中点的index,并将它存储到std::vector中 |
类OctreeIteratorBase为八叉树迭代器的基类,用于深度优先或广度优先遍历八叉树时使用。
序号 | 函数名称 | 解释说明 |
---|---|---|
1 | reset | 初始化迭代器 |
2 | getCurrentOctreeKey | 获取当前八叉树节点对应的迭代器的key值 |
3 | getCurrentOctreeDepth | 获取当前八叉树迭代器对应节点所在的深度 |
4 | getCurrentOctreeNode | 获取当前八叉树节点 |
5 | isBranchNode | 判断当前节点是否为分支节点,是返回true,不是返回false |
6 | isLeafNode | 判断当前节点是否为叶节点,是返回true,不是返回false |
7 | getNodeConfiguration | 获取当前节点的设置对应的bit值 |
8 | getLeafContainer | 获取八叉树中单叶节点 |
9 | getBranchContainer | 获取八叉树分支节点的容器 |
10 | getNodeID | 获取当前节点的唯一标识 |
备注:
a. 类OctreeDepthFirstIterator、OctreeBreadthFirstIterator是继承于类OctreeIteratorBase,分别表示深度优先遍历、广度优先遍历迭代器,它们的关键成员函数可以参考类OctreeIteratorBase。
b. 类OctreeFixedDepthIterator继承于类OctreeBreadthFirstIterator,表示以给定的深度来遍历所有的节点,并且是以广度优先进行遍历的。
c. 类OctreeLeafNodeDepthFirstIterator是继承于类OctreeDepthFirstIterator,表示深度优先遍历的叶节点迭代器
d. 类OctreeLeafNodeBreadthFirstIterator是继承于类OctreeBreadthFirstIterator,表示深度优先遍历的叶节点迭代器
类OctreeKey,表示八叉树键包含每个坐标轴的整数索引,以寻址八叉树叶节点。
序号 | 函数名称 | 解释说明 |
---|---|---|
1 | pushBranch | 将一个子节点添加到八叉树key中 |
2 | popBranch | 从八叉树key中去除一个子节点 |
3 | getChildIdxWithDepthMask | 根据depthMask值,获取子节点的索引 |
类OctreeNodePool,表示在快速生成八叉树时,减少内存分配和类实例化动作。
序号 | 函数名称 | 解释说明 |
---|---|---|
1 | pushNode | 在八叉树节点池中,添加一个节点 |
2 | popNode | 在八叉树节点池中,取出一个节点 |
3 | deletePool | 删除八叉树节点池中所有的节点 |
类OctreeNode为抽象类,即八叉树的节点;它的派生类有类OctreeLeafNode和OctreeBranchNode。
类OctreePointCloud为针对点云实现的八叉树数据结构,它的派生类有很多个,用于实现不同的点云处理或操作。
序号 | 函数名称 | 解释说明 |
---|---|---|
1 | setInputCloud | 设置八叉树管理的点云 |
2 | getIndices | 获取点云中每一点对应的索引的容器vector |
3 | getInputCloud | 获取点云数据集合的指针 |
4 | setEpsilon | 设置近邻搜索时的误差限 |
5 | getEpsilon | 获取近邻搜索时的误差限 |
6 | setResolution | 设置为点云建立的八叉树结构的分辨率,即体素的大小 |
7 | getResolution | 获取为点云建立的八叉树结构的分辨率,即体素的大小 |
9 | getTreeDepth | 获取八叉树的最大深度 |
10 | addPointsFromInputCloud | 将点云中的点,添加到八叉树中进行管理 |
11 | addPointFromCloud | 添加对应索引中的点到八叉树中进行管理 |
12 | addPointToCloud | 添加点point_arg到点云cloud_arg中 |
13 | isVoxelOccupiedAtPoint | 判断点所处的空间是否存在与八叉树体素中 |
14 | deleteTree | 删除八叉树数据结构和它的所有叶节点 |
15 | getOccupiedVoxelCenters | 获取所有被点云占据的体素的中心,并存储在voxel_center_list_arg中,返回值为被占数据的体素个数 |
16 | getApproxIntersectedVoxelCentersBySegment | 用参数origin和end给定空间一线段,该函数求得与改线段相交的体素中心,存储在voxel_center_list,并返回相交体素的个数 |
17 | deleteVoxelAtPoint | 删除指定点所在的八叉树所管理的体素或叶子节点 |
18 | defineBoundingBox | 指定八叉树的包围盒,参数为三个维度的上下限,八叉树中一旦存储管理元素了,则包围盒大小就不能再改变 |
19 | getBoundingBox | 获取八叉树的包围盒,即三维度的上下限 |
20 | getVoxelSquaredDiameter | 获取八叉树中指定深度对应体素的内切圆的直径 |
21 | getVoxelSquaredSideLen | 获取八叉树中指定深度对应体素的立方体的变长 |
22 | enableDynamicDepth | 启用动态八叉树结构,叶节点尽可能靠近根节点,并且仅当叶节点中的DataT对象数量超过固定限制时才展开 |
类OctreePointCloudAdjacency继承于OctreePointCloud类八叉树,该八叉树用于维护其体素元的邻接信息。其边界框将自动调整或可以预定义。
序号 | 函数名称 | 解释说明 |
---|---|---|
1 | computeVoxelAdjacencyGraph | 计算体素元关系的邻接图,当边缘范围变大 ,点云数据变多,其速度是会下降的。 |
2 | setTransformFunction | 设置转换函数,这对于更改计算邻接度的方式非常有用,例如,对于距离摄影机较远的点,放宽邻接标准 |
3 | testForOcclusion | 测试输入点是否被其他体素从指定摄影机点遮挡,true,表示挡住;false表示未挡住 |
4 | computeNeighbors | 填充新体素的“邻居”字段 |
5 | genOctreeKeyforPoint | 为指定点生成八叉树键(如果提供,则使用转换) |
类OctreePointCloudAdjacencyContainer继承于类OctreeContainerBase,是类OctreePointCloudAdjacency的容器。在叶节点增加了存储邻接叶的指针。
序号 | 函数名称 | 解释说明 |
---|---|---|
1 | getNumNeighbors | 获取当前叶节点有多少个邻节点的个数 |
2 | getPointCounter | 获取对此叶有贡献的点数 |
3 | getData | 返回对数据成员的引用,以便在不复制的情况下访问它 |
4 | setData | 设置成员变量data_ |
5 | getSize | 获取添加到叶节点容器的点数 |
类OctreePointCloudChangeDetector继承于OctreePointCloud的八叉树,该八叉树由新增加的叶子节点组成,该八叉树分辨率需要初始化,包围盒可自适应调整。
序号 | 函数名称 | 解释说明 |
---|---|---|
1 | getPointIndicesFromNewVoxels | 获取缓存区中新添加的叶子节点 |
类OctreePointCloudDensity继承于类OctreePointCloud的八叉树,该八叉树的其叶节点并非存储点云,只是对处于其叶节点中的点云个数进行存储,即整个八叉树的叶节点存储了输入点云的密度空间分布。
序号 | 函数名称 | 解释说明 |
---|---|---|
1 | getVoxelDensityAtPoint | 返回point_arg点所在的叶节点的密度,即点的个数 |
类OctreePointCloudOccupancy继承于类OctreePointCloud的八叉树,该八叉树的叶节点不存储任何数据,只是对输入点云所占的空间通过叶子所处的体素来进行标志,这样就可以对点云所占据空间的情况进行评估和检测。
序号 | 函数名称 | 解释说明 |
---|---|---|
1 | setOccupiedVoxelAtPoint | 在点所在的空间为八叉树添加叶节点,标识有点云占据该叶节点所在的提速空间 |
1 | setOccupiedVoxelsAtPointsFromCloud | 在点集所在的空间为八叉树添加叶节点,标识有点云占据该叶节点所在的提速空间 |
类OctreePointCloudPointVector继承于类OctreePointCloud的八叉树,该八叉树的叶节点,存储处在该节点体素中的点对应的索引向量。
类OctreePointCloudSinglePoint继承于类OctreePointCloud的八叉树,该八叉树叶节点,存储在该节点体素中的单个点的索引。
类OctreePointCloudVoxelCentroid继承于类OctreePointCloud的八叉树,该八叉树提供被电晕占据节点对应体素的中心坐标。
序号 | 函数名称 | 解释说明 |
---|---|---|
1 | getVoxelCentroidAtPoint | 返回指定节点对应的中心点坐标 |
2 | getVoxelCentroids | 获取所有占用体素的中心点坐标 |
3 | getVoxelCentroidsRecursive | 递归地探索八叉树,并为所有占用的体素输出中心点的坐标 |
;类OctreePointCloudSearch继承于OctreePointCloud的八叉树,该八叉树用于基于八叉树的点云近邻高效搜索。
序号 | 函数名称 | 解释说明 |
---|---|---|
1 | voxelSearch | 通过给定点,确定其所在的体素,返回体素中所有点的索引 |
2 | nearestKSearch | 近邻搜索 |
3 | approxNearestSearch | 近似近邻搜索 |
4 | radiusSearch | 获取指定点radius半径内的近邻点集 |
5 | getIntersectedVoxelCenters | 给定经过点origin指向direction的直线,返回与该直线相交的点云对应八叉树的体素中心点组成的向量,返回值为相交体素个数 |
6 | getIntersectedVoxelIndices | 功能同上,返回值存储相交体素的索引 |
7 | boxSearch | 搜索处于指定立方体内的点集 |
注意:
1. 以上所有类成员函数,仅说明函数名称表示的功能,为阐述其函数参数;
2. 关于函数重载,它们的功能其实是相同的,只是传递的参数不同。关于参数的说明,可参考源码。