《点云库PCL学习教程》第6章-八叉树教学内容.ppt





《《点云库PCL学习教程》第6章-八叉树教学内容.ppt》由会员分享,可在线阅读,更多相关《《点云库PCL学习教程》第6章-八叉树教学内容.ppt(65页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、点云库点云库PCLPCL学习教程学习教程第第6 6章章-八叉树八叉树建立空间索引在点云数据处理中已被广泛应用,常见空间索引一般是自顶向下逐级划分空间的各种空间索引结构,比较有代表性的包括BSP树、KD树、KDB树、R树、R+树、CELL树、四叉树和八叉树等索引结构,而在这些结构中KD树和八叉树在3D点云数据组织中应用较为广泛。PCL对八叉树的数据结构建立和索引方法进行了实现,以方便在此基础上的其他点云处理操作。本章首先对常用的点云空间索引方法octree概念进行介绍,然后对PCL的octree相关模块及类进行简单说明,最后通过应用实例来展示如何对PCL中octree模块进行灵活运用。本章各小节
2、目录6.1 octree概述及相关算法简介6.2 PCL中octree模块及类介绍6.3 应用实例解析6.1 octree概述及相关算法简介八叉树结构是由Hunter博士于1978年首次提出的一种数据模型。八叉树结构通过对三维空间的几何实体进行体元剖分,每个体元具有相同的时间和空间复杂度,通过循环递归的划分方法对大小为2n2n2n的三维空间的几何对象进行剖分,从而构成一个具有根节点的方向图。在八叉树结构中如果被划分的体元具有相同的属性,则该体元构成一个叶节点;否则继续对该体元剖分成8个子立方体,依次递归剖分,对于2n2n2n大小的空间对象,最多剖分n次,如图6-1所示。6.2 PCL中octr
3、ee模块及类介绍PCL中octree库提供了octree数据结构,利用FLANN进行快速邻域检索。邻域检索在匹配、特征描述子计算、领域特征提取中是非常基础的核心操作。octree模块利用十几个类实现了利用octree数据结构对点云的高效管理和检索,以及相应的一些空间处理算法,例如压缩、空间变化检测,其依赖于pcl_common模块。octree模模块中中类说明明目前PCL中octree模块中目前共有16个类,以后有可能增加。1.class pcl:octree:Octree2BufBase类Octree2BufBase实现了同时存储管理两个八叉树于内存中,如此,可以非常高效地实现八叉树的建立管
4、理等操作,并且该类实现对临近树节点结构的变化探测,对应到空间点云,其就可以对空间曲面的动态变化进行探测,在进行空间动态变化探测中非常有用,例如目前基于kinect设备的体感交互应用。类Octree2BufBase关键成员函数:void setMaxVoxelIndex(unsigned int maxVoxelIndex_arg)设置在各个维度上最大的体素个数。void setTreeDepth(unsigned int depth_arg)设置八叉树的深度,需要在初始化八叉树时设置。void add(unsigned int idxX_arg,unsigned idxY_arg,unsign
5、ed int idxZ_arg,const DataT&data_arg)在idxX、idxY、idxZ对应的叶子节点上填充DataT的数据,其中idxX、idxY、idxZ为在三个维度上的整型索引值。bool existLeaf(unsigned int idxX_arg,unsigned int idxY_arg,unsigned int idxZ_arg)const判断在idxX、idxY、idxZ对应的叶子节点是否存在,如果存在返回true,否则返回false。unsigned int getLeafCount()const返回在该八叉树中的叶子数目。unsigned int getB
6、ranchCount()const返回在该八叉树中的分支数目。void deleteTree(bool freeMemory_arg=false)删除八叉树的结构及其叶子节点。void deletePreviousBuffer()删除另一个缓冲区中对应八叉树的结构及其叶子节点。void deleteCurrentBuffer()删除当前缓冲区中对应八叉树的结构和其叶子节点。void switchBuffers()交换缓冲区,并重设八叉树结构。void serializeTree(std:vector&binaryTreeOut_arg,bool doXOREncoding_arg=false)
7、串行化输出八叉树结构到binaryTreeOut_arg向量,doXOREncoding_arg设置输出时是否将当前缓冲区与后台缓冲区中数据进行异或操作后再输出,异或操作是两个八叉树结构之间差异数据的输出。void serializeTree(std:vector&binaryTreeOut_arg,std:vector&dataVector_arg,bool doXOREncoding_arg=false)串行化重载函数,其中参数dataVector_arg存储八叉树中叶子节点上的数据,其他两个参数同上。void serializeLeafs(std:vector&dataVector_ar
8、g)参数dataVector_arg存储八叉树中叶子节点上的数据,该函数只串行化八叉树中的数据。void serializeNewLeafs(std:vector&dataVector_arg,const int minPointsPerLeaf_arg=0)串行化当前缓冲区八叉树中存在但在后台缓冲区八叉树中不存在的节点数据,其中,minPointsPerLeaf_arg为需要串行化的节点中点的最小个数,如果点个数小于该值则不串行化此新节点。void deserializeTree(std:vector&binaryTreeIn _arg,bool doXORDecoding_arg=fals
9、e)反串行化,参数意义上同上面对应的串行化函数。2.class pcl:octree:OctreeBase类OctreeBase为八叉树基类,其关键成员函数参考其他类介绍。3.class pcl:octree:OctreeBaseWithState类OctreeBaseWithState为带有状态的八叉树基类,其中额外存储的状态多用于可见性估计,同样其关键成员函数参考其他类的介绍。4.class pcl:octree:OctreeIteratorBase类OctreeIteratorBase为八叉树迭代器的基类,用于深度优先或广度优先遍历八叉树时使用。类OctreeIteratorBase关键
10、成员函数:void reset()初始化迭代器。const OctreeKey&getCurrentOctreeKey()const获取当前八叉树节点对应迭代器的键值。unsigned int getCurrentOctreeDepth()const获取当前八叉树迭代器对应节点所在的深度值。const OctreeNode*getCurrentOctreeNode()const获取当前八叉树节点。bool isBranchNode()const判断当前节点是否为分支节点,是返回true,否则返回false。bool isLeafNode()const判断当前节点是否为叶子节点,是返回true,
11、否则返回false。char getNodeConfiguration()const获取当前节点的设置对应的比特位值。virtual void getData(const DataT*&data_arg)const获取当前节点包含数据的首个元素。virtual void getData(std:vector&dataVector_arg)const获取当前节点对应的向量数据。virtual unsigned long getNodeID()const获取当前节点对应的整数ID。5.Class pcl:octree:OctreeDepthFirstIterator6.class pcl:octr
12、ee:OctreeDepthFirstIterator7.class pcl:octree:OctreeLeafNodeIterator以上3个类都继承于OctreeIteratorBase,分别实现深度优先遍历、广度优先遍历、叶子节点迭代器,关键函数参考其基类。8.class pcl:octree:OctreePointCloud类OctreePointCloud为针对点云实现的八叉树数据结构与相关算法,基于该类继承出多个子类,实现不同的点云处理或操作,如图6-2所示。类OctreePointCloud关键成员函数:void setInputCloud(const PointCloudCon
13、stPtr&cloud_arg,const IndicesConstPtr&indices_arg=IndicesConstPtr()设置八叉树管理的点云,其中cloud_arg为指向点云对象的指针,indices_arg为真正需要输入的点云的索引序列。void setEpsilon(double eps)设置近邻搜索时的误差限。void setResolution(double resolution_arg)设置为点云建立的八叉树结构的分辨率,即体素的大小。void addPointsFromInputCloud()显示调用将点云添加到八叉树管理结构中。void addPointFromCl
14、oud(const int pointIdx_arg,IndicesPtr indices_arg)添加对应索引中的点到八叉树中,其中pointIdx_arg为索引,indices_arg索引序列的指针。void addPointToCloud(const PointT&point_arg,PointCloudPtr cloud_arg,IndicesPtr indices_arg)添加点point_arg到点云cloud_arg的indices_arg索引下,同时添加到八叉树中。bool isVoxelOccupiedAtPoint(const PointT&point_arg)const判
15、断点point_arg所处的空间是否存在八叉树体素中。bool isVoxelOccupiedAtPoint(const double pointX_arg,const double pointY_arg,const double pointZ_arg)const判断点(pointX_arg,pointY_arg,pointZ_arg)所处的空间是否存在八叉树体素中。int getOccupiedVoxelCenters(AlignedPointTVector&voxelCenterList_arg)const获取所有被点云占据的体素的中心并存储在voxelCenterList_arg中,返回
16、值为被占据的体素的个数。int getApproxIntersectedVoxelCentersBySegment(const Eigen:Vector3f&origin,const Eigen:Vector3f&end,AlignedPointTVector&voxel_center_list,float precision=0.2)用参数origin和end给定空间一线段,该函数求得与该线段相交的体素中心,存储在voxel_center_list,并返回相交体素的个数。void deleteVoxelAtPoint(const PointT&point_arg)删除指定点所在的八叉树所管理
17、的体素或叶子节点。void defineBoundingBox(const double minX_arg,const double minY_arg,const double minZ_arg,const double maxX_arg,const double maxY_arg,const double maxZ_arg)指定八叉树的包围盒,参数为三个维度的上下限,八叉树中一旦存储管理元素了,则包围盒大小就不能再改变。void getBoudingBox(double&minX_arg,double&minY_arg,double&minZ_arg,double&maxX_arg,doub
18、le&maxY_arg,double&maxZ_arg)const获取包围盒3个维度的上下限。double getVoxelSquaredDiameter(unsigned int treeDepth_arg)const获取八叉树中指定深度对应体素的内切圆的直径。double getVoxelSquaredSideLen(unsigned int treeDepth_arg)const获取八叉树中指定深度对应体素的立方体的边长。9.class pcl:octree:OctreePointCloudChangeDetector类OctreePointCloudChangeDetector实现了创
19、建一八叉树,该八叉树由新增加的叶子节点组成,该八叉树分辨率需要初始化,包围盒可自适应调整。类OctreePointCloudChangeDetector关键成员函数,未列出的参考其父类OctreePointCloud:int getPointIndicesFromNewVoxels(std:vector&indicesVector_arg,const int minPointsPerLeaf_arg=0)获取缓存区中新添加的叶子节点,indicesVector_arg为新添加的叶子的索引向量,int minPointsPerLeaf_arg设置需要串行化的叶子中应该包含点的最小数目。void
20、setEpsilon(double eps)设置近邻搜索时的误差限。void setInputCloud(const PointCloudConstPtr&cloud_arg,const IndicesConstPtr&indices_arg=IndicesConstPtr()设置输入点云,其中cloud_arg表示输入的点云对象指针,indices_arg表示真正作为输入的点集的索引向量。void setResolution(double resolution_arg)设置八叉树分辨率。void addPointsFromInputCloud()添加利用setInputCloud函数设置的点
21、云到八叉树中。10.class pcl:octree:OctreePointCloudDensity类OctreePointCloudDensity实现了管理一八叉树,其叶子节点并非存储点云,只是对处于其叶子体素中的点云个数进行存储,即整个八叉树的叶子节点存储了输入点云的密度空间分布。类OctreePointCloudDensity关键成员函数,未列出的参考其父类OctreePointCloud:unsigned int getVoxelDensityAtPoint(const PointT&point_arg)const返回point_arg点所在的叶子节点体素的密度,即该点所在的体素中包含
22、点的个数。11.class pcl:octree:OctreePointCloudOccupancy类OctreePointCloudOccupancy实现了管理一八叉树,其叶子节点不存储任何数据,只是对输入点云所占据的空间通过叶子所处的体素来进行标志,这样就可以对点云所占据空间的情况进行评估和检测。类OctreePointCloudOccupancy关键成员函数,未列出的参考其父类OctreePointCloud:void setOccupiedVoxelAtPoint(const PointT&point_arg)在点point_arg所在空间为八叉树添加叶子节点,标识其有点云占据该节点所
23、在体素空间。void setOccupiedVoxelsAtPointsFromCloud(PointCloudPtr cloud_arg)在点集cloud_arg所在空间为八叉树添加叶子节点,标识其有点云占据该节点所在体素空间。12.class pcl:octree:OctreePointCloudPointVector类OctreePointCloudPointVector管理一八叉树,该八叉树叶子节点,存储处在该节点体素中的点对应的索引向量。类OctreePointCloudOccupancy关键成员函数,未列出的参考其父类OctreePointCloud:void setEpsilon
24、(double eps)设置近邻搜索时的误差限。void setInputCloud(const PointCloudConstPtr&cloud_arg,const IndicesConstPtr&indices_arg=IndicesConstPtr()设置输入点云,其中cloud_arg表示输入的点云对象指针,indices_arg表示真正作为输入的点集的索引向量。void setResolution(double resolution_arg)设置八叉树分辨率。13.class pcl:octree:OctreePointCloudSinglePoint类OctreePointClou
25、dSinglePoint管理一八叉树,该八叉树叶子节点,存储处在该节点体素中的单个点的索引,其关键函数参考类OctreePointCloudPointVector。14.class pcl:octree:OctreePointCloudVoxelCentroid类OctreePointCloudVoxelCentroid管理一八叉树,可提供被点云占据节点对应体素的中心点坐标。类OctreePointCloudVoxelCentroid关键成员函数,未列出的参考其父类OctreePointCloud:unsigned int getVoxelCentroids(AlignedPointTVect
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 点云库PCL学习教程 点云库 PCL 学习 教程 八叉树 教学内容

限制150内