《点云库PCL学习教程》第6章 八叉树

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void addPointFromCloud(const int pointIdx_arg, IndicesPtr indices_arg)
添加对应索引中的点到八叉树中,其中pointIdx_arg为索 引,indices_arg索引序列的指针。
void addPointToCloud(const PointT& point_arg, PointCloudPtr cloud_arg, IndicesPtr indices_arg)
void setMaxVoxelIndex(unsigned int maxVoxelIndex_arg)
设置在各个维度上最大的体素个数。
void setTreeDepth(unsigned int depth_arg)
设置八叉树的深度,需要在初始化八叉树时设置。
void add(unsigned int idxX_arg, unsigned idxY_arg, unsigned int idxZ_arg, const DataT& data_arg)
6.2 PCL中octree模块及类介绍
PCL中octree库提供了octree数据结构,利用FLANN进 行快速邻域检索。邻域检索在匹配、特征描述子 计算、领域特征提取中是非常基础的核心操作。 octree模块利用十几个类实现了利用octree数据结 构对点云的高效管理和检索,以及相应的一些空 间处理算法,例如压缩、空间变化检测,其依赖 于pcl_common模块。
添加点point_arg到点云cloud_arg的indices_arg索引下, 同时添加到八叉树中。
bool isVoxelOccupiedAtPoint(const PointT& point_arg) const
判断点point_arg所处的空间是否存在八叉树体素中。 bool isVoxelOccupiedAtPoint(const double pointX_arg, const double pointY_arg, const double pointZ_arg) const
第6章 八叉树
建立空间索引在点云数据处理中已被广泛应用,常见空 间索引一般是自顶向下逐级划分空间的各种空间索引 结构,比较有代表性的包括BSP树、KD树、KDB树、R 树、R+树、CELL树、四叉树和八叉树等索引结构,而 在这些结构中KD树和八叉树在3D点云数据组织中应用 较为广泛。PCL对八叉树的数据结构建立和索引方法 进行了实现,以方便在此基础上的其他点云处理操作。 本章首先对常用的点云空间索引方法octree概念进行介 绍,然后对PCL的octree相关模块及类进行简单说明, 最后通过应用实例来展示如何对PCL中octree模块进行 灵活运用。
octree模块中类说明
目前PCL中octree模块中目前共有16个类,以后有可能增 加。 1. class pcl::octree::Octree2BufBase<DataT, LeafT> 类Octree2BufBase实现了同时存储管理两个八叉树于内 存中,如此,可以非常高效地实现八叉树的建立管理 等操作,并且该类实现对临近树节点结构的变化探测, 对应到空间点云,其就可以对空间曲面的动态变化进 行探测,在进行空间动态变化探测中非常有用,例如 目前基于kinect设备的体感交互应用。 类Octree2BufBase关键成员函数:
删除八叉树的结构及其叶子节点。
void deletePreviousBuffer()
删除另一个缓冲区中对应八叉树的结构及其叶子节点。
void deleteCurrentBuffer()
删除当前缓冲区中对应八叉树的结构和其叶子节点。
void switchBuffers()
交换缓冲区,并重设八叉树结构。
int getApproxIntersectedVoxelCentersBySegment(const Eigen::Vector3f& origin, const Eigen::Vector3f& end, AlignedPointTVector& voxel_center_list, float precision=0.2)
判断点(pointX_arg, pointY_arg, pointZ_arg)所处的空间是 否存在八叉树体素中。
int getOccupiedVoxelCenters(AlignedPointTVector &voxelCenterList_arg) const
获取所有被点云占据的体素的中心并存储在 voxelCenterList_arg中,返回值为被占据的体素的个数。
判断在idxX、idxY、idxZ对应的叶子节点是否存在,如果 存在返回true,否则ቤተ መጻሕፍቲ ባይዱ回false。
unsigned int getLeafCount() const
返回在该八叉树中的叶子数目。
unsigned int getBranchCount() const
返回在该八叉树中的分支数目。
void deleteTree(bool freeMemory_arg=false)
获取当前八叉树迭代器对应节点所在的深度值。
const OctreeNode *getCurrentOctreeNode() const
获取当前八叉树节点。
bool isBranchNode() const
判断当前节点是否为分支节点,是返回true,否则返回 false。
bool isLeafNode() const
void setInputCloud(const PointCloudConstPtr& cloud_arg, const IndicesConstPtr& indices_arg=IndicesConstPtr())
设置八叉树管理的点云,其中cloud_arg为指向点云对象 的指针,indices_arg为真正需要输入的点云的索引序 列。
判断当前节点是否为叶子节点,是返回true,否则返回 false。
char getNodeConfiguration() const
获取当前节点的设置对应的比特位值。
virtual void getData(const DataT* &data_arg)const
获取当前节点包含数据的首个元素。
virtual void getData(std::vector<DataT>& dataVector_arg) const
本章各小节目录
6.1 octree概述及相关算法简介 6.2 PCL中octree模块及类介绍 6.3 应用实例解析
6.1 octree概述及相关算法简介
八叉树结构是由Hunter博士于1978年首次提出的一 种数据模型。八叉树结构通过对三维空间的几何 实体进行体元剖分,每个体元具有相同的时间和 空间复杂度,通过循环递归的划分方法对大小为 2n×2n×2n的三维空间的几何对象进行剖分,从 而构成一个具有根节点的方向图。在八叉树结构 中如果被划分的体元具有相同的属性,则该体元 构成一个叶节点;否则继续对该体元剖分成8个子 立方体,依次递归剖分,对于2n×2n×2n大小的 空间对象,最多剖分n次,如图6-1所示。
串行化当前缓冲区八叉树中存在但在后台缓冲区八叉树 中不存在的节点数据,其中,minPointsPerLeaf_arg为 需要串行化的节点中点的最小个数,如果点个数小于 该值则不串行化此新节点。
void deserializeTree(std::vector<char>& binaryTreeIn _arg, bool doXORDecoding_arg=false)
获取当前节点对应的向量数据。
virtual unsigned long getNodeID() const
获取当前节点对应的整数ID。 5. Class pcl::octree::OctreeDepthFirstIterator<DataT, LeafT, OctreeT>
6. class pcl::octree::OctreeDepthFirstIterator<DataT, LeafT, OctreeT> 7. class pcl::octree::OctreeLeafNodeIterator<DataT, LeafT, OctreeT> 以上3个类都继承于OctreeIteratorBase,分别实现深度优 先遍历、广度优先遍历、叶子节点迭代器,关键函数 参考其基类。 8. class pcl::octree::OctreePointCloud<PointT, LeafT, OctreeT> 类OctreePointCloud为针对点云实现的八叉树数据结构与 相关算法,基于该类继承出多个子类,实现不同的点 云处理或操作,如图6-2所示。 类OctreePointCloud关键成员函数:
优先或广度优先遍历八叉树时使用。 类OctreeIteratorBase关键成员函数:
void reset()
初始化迭代器。
const OctreeKey &getCurrentOctreeKey() const
获取当前八叉树节点对应迭代器的键值。
unsigned int getCurrentOctreeDepth() const
void serializeTree(std::vector<char>& binaryTreeOut_arg, bool doXOREncoding_arg=false)
串行化输出八叉树结构到binaryTreeOut_arg向量, doXOREncoding_arg设置输出时是否将当前缓冲区与后 台缓冲区中数据进行异或操作后再输出,异或操作是 两个八叉树结构之间差异数据的输出。
void serializeLeafs(std::vector<DataT>& dataVector_arg)
参数dataVector_arg存储八叉树中叶子节点上的数据,该 函数只串行化八叉树中的数据。
void serializeNewLeafs(std::vector<DataT>& dataVector_arg, const int minPointsPerLeaf_arg=0)
在idxX、idxY、idxZ对应的叶子节点上填充DataT的数据, 其中idxX、idxY、idxZ为在三个维度上的整型索引值。
bool existLeaf(unsigned int idxX_arg, unsigned int idxY_arg, unsigned int idxZ_arg) const
反串行化,参数意义上同上面对应的串行化函数。 2. class pcl::octree::OctreeBase<DataT, LeafT, OctreeBranchT> 类OctreeBase为八叉树基类,其关键成员函数参考其他 类介绍。 3. class pcl::octree::OctreeBaseWithState<DataT, LeafT> 类OctreeBaseWithState为带有状态的八叉树基类,其中 额外存储的状态多用于可见性估计,同样其关键成员 函数参考其他类的介绍。 4. class pcl::octree::OctreeIteratorBase<DataT, LeafT, OctreeT> 类OctreeIteratorBase为八叉树迭代器的基类,用于深度
void serializeTree(std::vector<char>& binaryTreeOut_arg, std::vector<DataT>& dataVector_arg, bool doXOREncoding_arg=false)
串行化重载函数,其中参数dataVector_arg存储八叉树中 叶子节点上的数据,其他两个参数同上。
void setEpsilon(double eps)
设置近邻搜索时的误差限。
void setResolution(double resolution_arg)
设置为点云建立的八叉树结构的分辨率,即体素的大小。
void addPointsFromInputCloud()
显示调用将点云添加到八叉树管理结构中。
相关文档
最新文档