




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第6章八叉树建立空间索引在点云数据处理中已被广泛应用,常见空 间索引一般是自顶向下逐级划分空间的各种空间索引 结构,比较有代表性的包括BSP树、KD树、KDB树、R 树、R+树、CELL树、四叉树和八叉树等索引结构,而 在这些结构中KD树和八叉树在3D点云数据组织中应用 较为广泛。PCL对八叉树的数据结构建立和索引方法 进行了实现,以方便在此基础上的其他点云处理操作。本章首先对常用的点云空间索引方法octree概念进行介 绍,然后对PCL的octree相关模块及类进行简单说明, 最后通过应用实例来展示如何对PCL中octree模块进行 灵活运用。本章各小节目录6.2 octree概述及相关算法
2、简介6.2 PCL中octree模块及类介绍6-3应用实例解析6.1 octree概述及相关算法简介八叉树结构是由Hunter博士于1978年首次提出的一 种数据模型。八叉树结构通过对三维空间的几何 实体进行体元剖分,每个体元具有相同的时间和 空间复杂度,通过循环递归的划分方法对大小为 2nX2nX2n的三维空间的几何对象进行剖分,从 而构成一个具有根节点的方向图。在八叉树结构 中如果被划分的体元具有相同的属性,则该体元 构成一个口+节点;否则维续姑该体元剖分成8个子 立方体,依次递归剖分,对于2nX2nX2n大小的 空间对象,最多剖分n次,如图6-1所示。octree示例(来自wiki)6.
3、2 PCL中octree模块及类介绍PCL中octree库提供了octree数据结构,利用FLANN进 行快速邻域检索。邻域检索在匹配、特征描述子 计算、领域特征提取中是非常基础的核心操作。 octree模块咄甬j几个类实现了利用octree数据结 构对点云的高效管理和检索,以及相应的一些空 间处理算法,仮四口压缩、空间变化检测,其依赖 于 pcLcomm on 模块。octree模块中类说明目前PC冲octree模块中目前共有16个类,以后有可能增 力口。1. class pcl:octree:Octree2BufBase<DataT/ LeafT>类Octree2BufBase
4、实现了同时存储管理两个八叉树于内 存中,如此,可以非常高效地实现八叉树的建立管理 等操作,并且该类实现对临近树节点结构的变化探测, 对应到空间点云,其就可以对空间曲面的动态变化进 行探测,在进行空间动态变化探测中非常有用,例如 目前基于kinect设备的体感交互应用。类Octree2BufBase关键成员函数:void setMaxVoxellndexfunsigned int maxVoxellndex_arg)设置在各个维度上最大的体素个数。void setTreeDepth(unsigned int depth_arg)设置八叉树的深度,需要在初始化八叉树时设置。void add(uns
5、igned int idxX_arg, unsigned idxY_arg, unsigned intidxZ_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,否则返回fa
6、lse。unsigned int getLeafCount() const返回在该八叉树中的叶子数目Ounsigned int getBranchCount() const返回在该八叉树中的分支数目Ovoid deleteTree(bool freeMemory_arg=false) 删除八叉树的结构及其叶子节点。void deletePreviousBuffer()删除另一个缓冲区中对应八叉树的结构及其叶子节点。void deleteCurrentBuffer()删除当前缓冲区中对应八叉树的结构和其叶子节点。void switchBuffers()交换缓冲区,并重设八叉树结构。void se
7、rializeTree(std:vector<char>& binaryTreeOut_arg, booldoXORE ncodi ng_arg二false)串行化输出八叉树结构到binaryTreeOutarg向量, doXOREncoding_arg设置输出时是否将当前缓冲区与后 台缓冲区中数据进行异或操作后再输出,异或操作是 两个八叉树结构之间差异数据的输出。void serializeTree(std:vector<char>& binaryTreeOut_arg, std:vector<DataT>& dataVector_
8、arg, bool doXORE ncodi ng_arg 二 false)串行化重载函数,其中参数dataVector_arg存储八叉树中 叶子节点上的数据,其他两个参数扁上。void serializeLeafs(std:vector<DataT>& dataVector_arg)参数dataVectorarg存储八叉树中叶子节点上的数据,该 函数只串行尼八叉树中的数据。void serializeNewLeafs(std:vector<DataT>& dataVector_arg,const int minPointsPerLeaf_arg=O)串
9、行化当前缓冲区八叉树中存在但在后台缓冲区八叉树 中不存在的节点数据,其中,minPointsPerLeaf_arg为 需要串行化的节点中点的最小个数,如果点个竅小于 该值则禾串行化此新节点。void deserializeTree(std:vector<char>& binaryTreeln _arg, bool doXORDecoding_arg=false)反串行化,参数意义上同上面对应的串行化函数。2. class pcl:octree:OctreeBase<Datal; LeafX OctreeBranchT>类OctreeBase为八叉树基类,其关键成
10、员函数参考其他 类介绍。3. class pcl:octree:OctreeBaseWithState<DataT; LeafT> 类OctreeBaseWithState为带有状态的八叉树基类,其中额外存储的状态多用于可见性估计,同样其关键成员 函数参考其他类的介绍。4. class pcl:octree:OctreelteratorBase<DataT, Leaf!; OctreeT>类OctreelteratorBase为八叉树迭代器的基类,用于深度优先或广度优先遍历八叉树时使用。类OctreelteratorBase关键成员函数:void reset()初始化迭
11、代器。const OctreeKey &getCurrentOctreeKey() const获取当前八叉树节点对应迭代器的键值。unsigned int getCurrentOctreeDepth() const 获取当前八叉树迭代器对应节点所在的深度值。const OctreeNode *getCurrentOctreeNode() const获取当前八叉树节点。bool isBranchNode() const判断当前节点是否为分支节点,是返回true,否则返回 false。bool isLeafNode() const判断当前节点是否为叶子节点,是返回true,否则返回 fal
12、se。char getNodeConfiguration() const 获取当前节点的设置对应的比特位值。 virtual void getData(const DataT* &data_arg)const 获取当前节点包含数据的首个元素。virtual void get Data (std: vecto r< DataT >& dataVector_arg) const获取当前节点对应的向量数据。virtual unsigned long getNodelDf) const 获取当前节点对应的整数ID。5. Class pcl:octree:OctreeDept
13、hFirstlterator<DataT/ Leaf!; OctreeT>6. class pcl:octree:OctreeDepthFirstlterator<Datal; LeafT, OctreeT>7. class pcl:octree:OctreeLeafNodelterator<Datal; LeafT, OctreeT>以上3个类都继承于OctreelteratorBase,分别实现深度优 先遍历、广度优先遍历、叶子节点迭代器,关键函数 参考其基类。 class pcl:octree:OctreePointCloud<Pointl; L
14、eaf!,OctreeT>类OctreePointCloud为针对点云实现的八叉树数据结构与 相关算法,基于该类继承世多个子类,实现不同的点 云处理或操作,如图6-2所示。类OctreePointCloud关键成员函数:void setlnputCloud(const PointCloudConstPtr& cloud_arg, const IndicesConstPtr& indices_arg=lndicesConstPtr()设置八叉树管理的点云,其中cloud_arg为指向点云对象 的指针,indices_arg为真正需要输入的点云的索引序 列。void setE
15、psilon(double eps)设置近邻搜索时的误差限。void setResolutionfdouble resolution_arg)设置为点云建立的八叉树结构的分辨率,即体素的大小。图62 OctreePointCloud类的堆承关系void addPointsFromlnputCloud()显示调用将点云添加到八叉树管理结构中。void addPointFromCloudfconst int pointldx_arg, IndicesPtr in dices_arg)添加对应索引中的点到八叉树中,其中pointldx_arg为索 弓|, indices_arg索引序列的指针。voi
16、d addPointToCloud(const PointT& point_arg, PointCloudPtr cloud_arg, IndicesPtr indices_arg)添加点point_arg到点云cl oud_arg的indices_arg索引下, 同时添加到八叉树中。bool isVoxelOccupiedAtPointfconst PointT& point_arg) const判断点pointarg所处的空间是否存在八叉树体素中。bool isVoxelOccupiedAtPoint(const double pointX_arg, const doubl
17、e pointY_arg, const double pointZ_arg) const判断点(pointX_arg, pointY_arg, pointZ_arg)所处的空间是 否存在八叉旃体素中。int getOccupiedVoxelCentersfAlig nedPoi ntTVector<voxelCenterList_arg) const获取所有被点云占据的体素的中心并存储在voxelCenterList_arg中,返回值为被占据的体素的个数。int getApproxI ntersectedVoxelCentersBySegme nt(constEigen:Vector3f
18、& origin, const Eigen:Vector3f& end,AlignedPointTVector& voxel_center_list, float precision=0.2)用参数origin和end给定空间一线段,该函数求得与该线 段相交的体素中心,存储在voxel_centerjist,并返回 相交体素的个数。void deleteVoxelAtPoint(const PointT& point_arg)删除指定点所在的八叉树所管理的体素或叶子节点。void defineBoundingBox(const double minX_arg,
19、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, double& maxY_arg,double&a
20、mp; maxZ_arg) const获取包围盒3个维度的上下限。double getVoxelSquaredDiameter(unsigned int treeDepth_arg) const获取八叉树中指定深度对应体素的内切圆的直径。 double getVoxeISquaredSideLen(unsigned int treeDepth_arg) const获取八叉树中指定深度对应体素的立方体的边长。9. class pcl:octree:OctreePointCloudChangeDetectorvPointl; LeafT>类 OctreePointCloudChangeDet
21、ector 实现了 创建一八叉树, 该八叉树由新增加的叶子节点组成,该八叉树分辨率 需要初始化,包围盒可自适应调整。类OctreePointCloudChangeDetector关键成员函数,未列 出的参考其父类OctreePointCloud:int getPointl ndicesFromNewVoxels(std:vectorvint >&indicesVector_arg, const int minPointsPerLeaf_arg=0)获取缓存区中新添加的叶子节点,indicesVector_arg为新 添加的叶子的索引向量,int minPointsPerLeaf_
22、arg设置 需要串行化的叶子中应该包含点的最小数目。void setEpsilon(double eps)设置近邻搜索时的误差限。void setlnputCloud(const PointCloudConstPtr& cloud_arg, constIndicesConstPtr& indices_arg=lndicesConstPtr()设置输入点云,其中cloud_arg表示输入的点云对象指针, indices_arg表示真正作务输入的点集的索引向量。void setResolution(double resolution_arg) 设置八叉树分辨率。void addPo
23、intsFromlnputCloudO添加利用setinputcloud函数设置的点云到八叉树中。10. class pcl:octree:OctreePointCloudDensity<Pointl; LeafX OctreeT>类OctreePointCloudDensity实现了管理一八叉树,其叶子 节点并非存储点云,只是对处于其叶子体素中的点云 个数进行存储,即整个八叉树的叶子节点存储了输入点云的密度空间分布。类OctreePointCloudDensity关键成员函数,未列出的参考 其父类 OctreePointCloud:unsigned int getVoxelDen
24、sityAtPoint(const PointT& point_arg)const返回point_arg点所在的叶子节点体素的密度,即该点所 在的体秦中包含点的个数。11. class pcl:octree:OctreePointCloudOccupancy<PoinfG LeafT, OctreeT>类OctreePointCloudOccupancy实现了管理一八叉树,其叶子节点不存储任何数据,只是对输入点云所占据的 空间通过叶子所处的体素来进行标志,这样就可以对 点云所占据空间的情况进行评估和检测。参考其父类 OctreePointCloud:void setOccu
25、piedVoxelAtPoint(const PointT& point_arg)在点point_arg所在空间为八叉树添加叶子节点,标识其 有点云占据该节点所在体素空间。void setOccupiedVoxelsAtPointsFromCloud(PointCloudPtr cloud_arg)在点集cloud_arg所在空间为八叉树添加叶子节点,标识 其有点云旨据该节点所在体素空间。12. class pcl:octree:OctreePointCloudPointVectorvPoint LeafT, OctreeT>类OctreePointCloudPointVecto
26、r管理一八叉树,该八叉树 叶子节点,存储处在该节点体素中的点对应的索引向 量。类OctreePointCloudOccupancy关键成员函数,未列出的参考其父类 OctreePointCloud: void setEpsilon(double eps) 设置近邻搜索时的误差限。void setlnputCloud(const PointCloudConstPtr& cloud_arg, constIndicesConstPtr& indices_arg=lndicesConstPtr()设置输入点云,其中cloud_arg表示输入的点云对象指针, indices_arg表示真
27、正作务输入的点集的索引向量。void setResolution(double resolution_arg) 设置八叉树分辨率。13. class pcIoctreeOctreePointCloudSinglePoinKPointT, LeafX OctreeT>类OctreePointCloudSinglePoint管理一八叉树,该八叉树 叶子节点,存储处在该节点体素中的单个点的索引, 其关键函数参考类 OctreePointCloudPointVectoro14. class pcl:octree:OctreePointCloudVoxelCentroid<PointT/ L
28、eafT, OctreeT>类OctreePointCloudVoxelCentroid管理一八叉树,可提供 被点云占据节点对应体素的中心点坐标。类OctreePointCloudVoxelCentroid关键成员函数,未列出 的参考其父类OctreePointCloud:unsigned int getVoxelCentroids(AlignedPointTVector&voxe ICentroidList_arg)返回所有被点云占据的叶子节点的中心点组成的向量, 存储在voxeICentroidList_arg中,返回值为返回中心的 个数。bool getVoxelCentr
29、oidAtPoint(const PointT& point_arg, PointT & voxelCe ntroid_arg)返回点point_arg对应的节点体素的中心虽存储'在 voxelCentroid_arg中,返回值为true表示操作成功,否 则表示操作矣败。bool getVoxelCentroidAtPoint(const int& pointldx_arg, PointT& voxelCe ntroid_arg)返回索引pointldx_arg对应点所代表的节点体素中p点, 存储在voxelCentroid_arg中,返回值为true表
30、示成功, 否则表示操作失败。15. Class pcl:octree:OctreePointCloudSearch<Pointl; LeafT, OctreeT>类OctreePointCloudSearch实现了基于八叉树的点云近邻 高效搜索。类 OctreePointCloudSearch 关键成员 函数:bool voxelSearch(const PointT& point, std:vector<int>&pointldx_data)给定查询点point,通过point确定其所在的体素,返回体素中所有点的索引存储在pointldxdata。bo
31、ol voxelSearch(const int index, std:vector<int>&pointldx_data)功能同上函数,区别是查询点通过index指定。int nearestKSearch(const PointCloud& cloud, int index, int k,std:vector<int>& kjndices, std:vector<float>k_sqr_dista nces)近邻搜索,Cloud为搜索的点云对index为查询点的索引,k为搜索返回的近邻个数,kjndices为返回近邻 索引向量,k_
32、sqr_distances存储近邻点对应的距离平 方向量。int nearestKSearchfconst PointT& p_q, int k, std:vector<int>&kjndices, std:vector<float>& k_sqr_distances) 功能同上,p_q为指定的查询点,其他参数类似。void approxNearestSearch(const PointCloud& cloud, int queryjndex, int& resultjndex, float& sqr_distance)
33、近似近邻搜索,其他参数同上。int radiusSearch(const PointCloud& cloud, int index, double radius, std:vector<int>& kjndices, std:vector<float>& k_sqr_distarices, unsigned int max_nn=0)获取查询点radius半径内的近邻点集,cloud为搜索的点云对象,index为查询点的索引,k为搜索返回的近邻个数,kjndices为返回近邻索引向量,k_sqr_distances 存储近邻点对应的距离平方向量,
34、max.nnim为0, 如果设置就返回半径内邻域个数上限,返回值为返回 领域点的个数。int getl ntersectedVoxelCe nters(Eigen: Vector3f origin, Eigen:Vector3f direction, AlignedPointTVector& voxelCenterList) const给定经过点origin指向direction的直线,返回与该直线相 交的点云对应八叉树的体素中心点组成的向量,并存 储在voxelCenterList中,返回值为相交体素个数。int getl ntersectedVoxellndicesfEige n:
35、Vector3f origi n,Eigen:Vector3f direction, std:vector<int>& kndices) const 功能同上函数,kjndices存储相交体素的索引。int boxSearch(const Eigen:Vector3f& min_pt, constEigen:Vector3f& tnax_pt, std:vector<int>& kndices) const搜索处于指定立方体内的点集,min_pt、max_pt指定立 方体的左前下角坐标及右后上方巫标来定文立方体, kjndices存储落在
36、立方体内的点的索引。void setlnputCloud(const PointCloudConstPtr& cloud_arg, constIndicesConstPtr& indices_arg=lndicesConstPtr()指定构建八叉树的点云。void setEpsilon(double eps)设置搜索时的精度。void setResolutionfdouble resolution_arg)设置八叉树的体素分辨率。void addPointsFromInputCloud()显示调用将点云添加到八叉树管理结构中。void addPointFromCloud(con
37、st int pointldx_arg, IndicesPtr in dices_arg)添加对应索引中的点到八叉树中,其中pointldx_arg为索 弓|, indices_arg索引序列的指针。void addPointToCloud(const PointT& point_arg, PointCloudPtr cloud_arg, IndicesPtr indices_arg)添加点point_arg到点云cloud_arg的indices_arg索引下, 同时添加到八叉树中。bool isVoxelOccupiedAtPointfconst PointT& point
38、_arg) const 判断点point_arg所处的空间是否存在于八叉树体素中。 bool isVoxelOccupiedAtPointfc on st double pointX_arg, const double pointY_arg, const double pointZ_arg) const 判断点(pointX_arg, pointY_arg, pointZ_arg)所处的空间是 否存在于八文树体素中。int getOccupiedVoxelCentersfAlig nedPoi ntTVectorA/oxelCenterList_arg) const返回所有被点云占据的体素的中
39、心存储在voxelCenterList_arg中,返回值为被占据的体素的个数。int getApproxI ntersectedVoxelCe ntersBySegme nt(constEigen:Vector3f& origin, const Eigen:Vector3f& end,AlignedPointTVector& voxel_center_list, float precision二.2)用参数origin和end给定空间一线段,该函数求得与该线段相交的体素中心,存储在voxel_center_list,并返回相 交体素的个数。void deleteVoxe
40、lAtPoint(const PointT& point_arg)删除指定点所在的八叉树中管理的体素或叶子节点。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)指定八叉树的包围盒,参数为3个维度的上下限,八叉 树中一旦存储管理元素了,则包围盒大小就不能再改 变。void getBoudingBox(double&
41、; minX_arg, double& minY_arg,double& minZ_arg, double& maxX_arg, double& maxY_arg,double& maxZ_arg) const获取包围盒子3个维度的上下限。double getVoxelSquaredDiameter(unsigned int treeDepth_arg) const获取八叉树中指定深度对应体素的内切圆的直径。double getVoxeISquaredSideLen(unsigned int treeDepth_arg) const获取八叉树中指定深度对
42、应体素的立方体的边长。6.3应用实例解析6.3.1在PCL中如何实现点云压缩点云由海量的数据集组成,这些数据集通过距离、颜色、 法线等附加信息来描述空间三维点。此外,点云能以 非常高的速率被创建出来,因此需要占用相当大的存 储资源,一旦点云需要存储或者通过速率受限制的通 信信道进行传输,提供针对这种数据的压缩方法就变 得十分有用。PCL库提供了点云压缩功能,它允许编 码压缩所有类型的点云,如图6-3所示,包括“无序” 点云,它具有无参考点和变化的点尺寸、分辨率、分 布密度和点顺序等结构特征。而且,底层Woctree数 据结构允许从几个输入源高效地合并点云数据c下面解释单个点云和点云数据流是如何
43、高效压缩的,在 给出的例子中用PCL点云压绳技术来压缩用 OpenNIGrabber抓取到的点云。在本书提供光盘的第6章例1文件夹、中扌丁开名为 point_cloud_coinpressioricpp 的代码文件。1.代码解释说明下面详细解析打开的源代码。从主函数开始首先创建一 个薪的SimpleOpenNIViewer实例并调用它的run()方法。int main(int argc, char* argv) SimpleOpenNIViewer v; v.run();return(O);在run()函数中创建PointCloudCompression类的对象来编码和解码,这些对象把压缩配置
44、文件作为配置压缩算法的参数,所提供的压缩配置文件为OpenNI兼容设备采集到的点云预先确定的通用参数集。本例中使用MED_RES_ONLINE_COMPRESSION_WITH_COLOR 配置参数集,它血用5mrr?的编码精度并且允讦彩色纹理成分编码,并进一步优化,用于快速在线压缩。压缩配置 文件的完整列表及其配制方法可以在文件“/io/incl ude/pcl/compressio n/compressio n_ profiles, h” 中找到。在PointCloudCompression构造函数中使用 MANUACONFIGURATION鷹性就可以手动设置庄缩算 法全部蔘毀。bool
45、showStatistics=true; /设置在标准设备上输出打印出压缩结果 信息压缩选项详见/io/i nclude/pcl/compression/compressio n_ profiles.hpcl:octree:compressi on _Profiles_e compressionProfile=pcl:octree:MED_RES_ONLINE_COMPRESSION WITH COLOR;初始化压缩与解压缩对象,其中压缩对象需要设定压缩参数选项, 解压缩按照数据源自行判断poin tCloudE ncoder 二 newpcl:octree:Poi ntCloudCompre
46、ssio nvpcl:Poi ntXYZRGBA>(compressi on Profile, showstatistics);poin tCloudDecoder 二 new pcl:octree:PointCloudCompression<pcl:PointXYZRGBA>();下面的代码为OpenNI兼容设备实例化一个新的采集器, 并且启动循环回调接口,每从设备获取一帧数据就调 用回调函数一次,这里的回调函数实现数据压缩和可 视化解压缩结果。创建从OpenNI获取点云的抓取对象pcl:Grabber* interface = new pcl:OpenNIGrabber(
47、);boost:fu nctionv void(c onst pcl:PointCloud<pcl:PointXYZRGBA>:ConstPtr&)> f = boost:bind(&SimpleOpenNIViewer:cloud_cb_, this, _1); 建立回 调函数_ _建立回调函数与回调信号之间绑定boost:signals2:corrnection c = interface->registerCallback(f);开始接收点云数据流interface->start();while(!viewer.wasStopped()sle
48、ep(l);interface->stop();在OpenNIGrabber采集循环执行的回调函数cloud_cb_4:I, 首先把获取到的点云压缩到stringstream缓冲E 卞一步是解压缩,它对压缩了的二进制数据进行解码,存储在新 的点云对象中,解码了的点云被发送到点云可视化对象中 进行实时可视化。void cloud_cb_(const pcl:PointCloud<pcl:PointXYZRGBA>:ConstPtr& cloud)if(!viewer.wasStopped()std:stringstream compressedData; /存储压缩点云
49、的宁节流对象 pcl:PointCloud<pcl:PointXYZRGBA>: PtrcloudOut 存储输出点云 (new pcl:PointCloud<pcl:PointXYZRGBA>();PointCloudEncoder->encodePointCloud(cloud, compressedData); 压缩点云PointCloudDecoder->decodePointCloud(compressedData, cloudOut); 解压 缩点云viewer.showCloud(cloudOut); / 可视化解压缩点云在压缩与解压缩过程中,
50、因为设置compressedData为true所以在 标准输出上打印出压缩率帧数等信息2.编译并运行该程序利用光盘提供的CMakeLists.txt文件,在CMake中建立工 程文件并生成相应的可执行文件,生成执行文件后, 就可以运行了,在CMD中键入命令:.>point_cloud_compressio n.exe可以看到图6-4所示结果,左边为带有RGB纹理信息的实 时可视化结果,用户缩放可视化结果可以看到经过压 缩后点云进行了重采样,纹理信息有所丢失,但数据 量有所减小,在实际应用中需折中取舍。右边则为实 时压缩信息输出,可以看岀压缩的帧数、点数、压缩 翠等信息。3.压缩配置文件压
51、缩配置文件为PCL点云编码器定义了参数集,并针对 压缩从OpenNI采集器获取的普通点云进行了优化设置。 注意,解码对象不需要用参数表示,因为它在解码时检测并获取对应的编码参数配置。下面的压缩配置文件 是可用的:LOW_RES_ONLINE_COMPRESSION_WITHOUT_COLOR:分辨家lc祁,无顏色,快速在线编码LOW_RES_ONLINE_COMPRESSION_WITH_COLOR:分辨率lcm3,有颜色,快速在线编阿MED_RES_ONLINE_COMPRESSION_WITHOUT_COLOR:分辨家5mm3,无预色,快速在线编码M E D_R ES_O N LI N E
52、_CO M P R ESS IO N_W ITH_CO LO R :分辨率 5mm3,有颜色,快速在线编码HIGH_RES_ONLINE_COMPRESSION_WITHOUT_COLOR:分辨$lmm3,无颜色,快速在线鎗码HIGH_RES_ONLINE_COMPRESSION_WITH_COLOR:分辨率 1mm3,有颜色,快速在线编码LOW_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR:分 gWlcm3 ,无威色,高效离线鎗码LOW_RES_OFFLINE_COMPRESSION_WITH_COLOR:分辨 率lcrn3,有颜国,高效离线编阿MED_RES_
53、OFFLINE_COMPRESSION_WITHOUT_COLOR:分 辨家5mm3,无颜色,高效离线鎗码MED_RES_OFFUNE_COMPRESSION_WITH_COLOR:分辨 率5mrrf,有颜色,高效离线编E马HIGH_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR: 分辨率5mm3,免颜色,高效离殘编码HIGH_RES_OFFLINE_COMPRESSION_WITH_COLOR:分辨率5mm3,有颜色,高效离线编i马MAN UAL_CON FIG U RATIO N允许为高级参数化进行手工配 置。4.高级参数化为了能完全控制压缩相关的参数,Poin
54、tCloudCompression类的构造函数可以在初始化时 附加压缩参数。请注意,为了启用高级参数化, compressionProfilearg参数需要被设置成MANUAL_CONFIGURATIONoPoin tCloudCompression(compressio n_Profiles_ecompressionProfile_arg, bool showStatistics_arg, const double pointResolution_arg, const double octreeResolu1:ion_arg, bool doVoxelGridDownDownSampling
55、_arg, const unsigned intiFrameRate_arg, bool doColorEncoding_arg, const unsigned char colorBitResoluti on_ arg)下面解释高级参数化设置:compressionProfile_arg:为了启用高级参数化,该参数应 该被设置成MANUAL CONFIGURATIONoshowStatistics_arg:把压缩相关的统计信息打印到标准 输出。pointResolution_arg:定义点坐标的编码精度,该参数应 该设置成小于传感器精度的一个值。octreeResolution_arg:该参
56、数定义展开了的octree的体素 大小,较大的抵素分辨率使得压缩更快,但是压缩质 量下降,这在较高的帧速率(上传速率)和压缩效率 中间进行了折中设置。doVoxelGridDownDownSainpling_arg:如果激活该参数, 那么只编码分层octree的数感吉构,解码对象在体素 中心生成点,通过这种方法点云在压缩期间被下采样, 同时达到了较高的压缩性能。iFrameRate_arg:点云压缩模式对点云进行差分编码压 缩,用疚种方法对新引入的点云和之前编码的点云之间的差分进行编码,以便获得最大压缩性能,用这种方 法对新引入的点云和之前编码的点云之间的差分进行 编码,以便获得最大压缩性能,
57、iFrameRate_arg允许 指定数据流中的某一帧速率,在这一速率卡传输的点 云就不进行差分编码压缩(同视频编码中的I/P帧类 似)。doColorEncoding_arg:该选项启用彩色纹理成分编码压 缩。colorBitResolution_arg:该参数定义每一个彩色成分编码 后所占的位数。一5. PCL点云数据流压缩的命令行工具PCL应用程序工具中包含点云流数据压缩命令行工具 openni_stream_compression.exe,用户可以查看选项 的完靈列表(注意:屏幕上的输出可能不同)。该工具可以在安装好的PCL的bin目录下找到。用户可以自行 试验看看其强大的功能,具体参
58、看其命令行帮助提示。 例如它可以通过网络进行点云压缩传输。为了通过TCP/IP传输压缩点云,可以用下面的命令启动 服务器:.>openni_stream-compression.exe -s它会监听6666端口看是否有接入链接请求,用下面的命 令开启客户端:.>openni_stream_compression -c SERVER_NAME远程采集到的点云可以通过点云查看工具在本地显示,笔者测试结果如图6-5所示。IInr ft:唆 II tr- urn®xmr少r.iraxirIS ” y U " ml "*叫 r >ti nt* rm f rm ui i ) *tr u n:cn 2 <%VM Mt t nm wr *1 "g 山 I T» U<* f !»阿2W®« HS hf Mr s>M «u «FI1 ; Mr f >F au n K,J Im* iem iia C<< t«rrvtm52"心imM car» JblhC *ir re»tKilt U'w尸< w. «t O、 «
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 多方协作机制设计-洞察及研究
- 2025苏教版小学科学六年级课堂教学计划
- 期中考试过程1200字(13篇)
- 土地开发整治及使用权转让合同书
- 写给奶奶的一封信750字(10篇)
- 箭牌供应商课件
- 企业共享数据中心建设协议
- 企业知识产权保护操作指南及文件模板
- 水利工程施工管理机构职责
- 单位消防安全管理题库及答案解析
- 无人机测绘中职教学计划
- 小学生队形队列班会课件
- 绿色系古风类中国传统文化漆扇介绍模板
- 职业技术学院运动健康指导专业人才培养方案
- 离婚后小孩学费协议书
- 初中学校学科竞赛策划工作计划
- 高危儿规范化健康管理专家共识
- 第一单元 第二课 传感之古今未来 教学设计2024-2025学年人教版(2024)初中信息科技八年级上册
- 电压的测量课件
- 医美知识培训课件
- 私募股权投资协议样本
评论
0/150
提交评论