pcl 点云压缩与解压缩

  • 为什么要进行点云压缩
  • 压缩pcl::PointXYZ类型数据
    • Code
      • 压缩部分
    • Result
  • 压缩 pcl::PointXYZRGB 类型数据
    • 生成XYZRGB的数据
    • 压缩和解压
    • Result

为什么要进行点云压缩

点云带有大量的数据,不仅包括三维信息,还有额外的距离,颜色,法向量等等。此外,点云可以快速生成,这会占有大量的内存资源。一旦点云必须被存储或者用于通信传输,对于点云的压缩技术就显得十分重要了。PCL提供了点云压缩功能,它支持对各种类型点云的压缩,其中包括无序点云,此外,在八叉树结构下的数据支持高效地合并多个来自不同数据源的点云。

压缩pcl::PointXYZ类型数据

Code

最基本的操作 : 将读取点云,然后压缩成字节流,再将字节流解压。

    //先读取点云/*创建一个点云变量 的共享指针  并实例化*/pcl::PointCloud<pcl::PointXYZ> cloud;/*从 pcd文件  读取 点云*/if(pcl::io::loadPCDFile<pcl::PointXYZ>("../test_pcd.pcd",cloud)==-1){    //  返回值是 -1  代表 没有读到PCL_ERROR("Couldn't read file test_pcd.pcd \n");return  (-1);}

先读取点云 从 pcd文件 读取 点云

     //打印压缩前从文件中读取的点云std::cout<<"before"<<std::endl;for(size_t i;i<cloud.points.size();++i){ std::cout<<"x="<<cloud.points[i].x<<"\t"<<"y="<<cloud.points[i].y<<"\t"<<"z="<<cloud.points[i].z<<std::endl;}

打印压缩前从文件中读取的点云

压缩部分

       /* 设置压缩 和解压 时 的结果信息是否打印显示出来  */bool showStatistics = true ;//bool showStatistics = false;

设置压缩 和解压 时 的结果信息是否打印显示出来

打印的 信息 就是 上面 这种

      /* 压缩选项  可以参考 usr/include/pcl/compression/compression_profiles.h   */    pcl::io::compression_Profiles_e compressionProfile = pcl::io::MANUAL_CONFIGURATION;//设定为允许为高级参数化进行手工配置

这个部分要详细说明下
pcl::io::MANUAL_CONFIGURATION 这个是压缩类型的一种 , 用来配置 八叉树的压缩参数。如果选择进行手工设置,则需要在后面进行相关的参数设置。共6个参数。

可以参考 usr/include/pcl/compression/compression_profiles.h

这个是文件里的 可选的压缩类型


下面分别对应着 不同类型对应的参数
一共有6个参数

  1. pointResolution 点的分辨率该变量决定了点的坐标在编码时可以精确的程度,但是该变量只在进行细节编码(detail coding)时才会生效
  2. octreeResolution 划分八叉树时最小块
  3. doVoxelGridDownDownSampling 是否对点云文件进行下采样。为true时,对点云文件进行下采样,以体素的中心点的坐标来代替整个体素内的点的坐标,而颜色则以体素内所有点的颜色的均值为代表,此时pointResolution不会生效。为false时,则进行细节编码,即编码一个体素内的具体坐标与颜色,实现方式是计算体素内每个点到体素左下角的偏移量,并通过整除pointResolution来得到整数坐标,而颜色则需编码体素内每个点的颜色相对于平均值的残差
  4. iFrameRate 用来决定进行I帧编码的频率,如果此数值为30,则每隔30帧进行一次I帧编码,中间的帧则进行P帧编码
  5. colorBitResolution 表示颜色的RGB的保留的有效位数
  6. doColorEncoding 决定是否进行颜色编码。

下面列举下不同 编码类型的对应的含义

LOW_RES_ONLINE_COMPRESSION_WITHOUT_COLOR 分辨率1cm3,无颜色,快速在线编码
LOW_RES_ONLINE_COMPRESSION_WITH_COLOR 分辨率1cm3,有颜色,快速在线编码
MED_RES_ONLINE_COMPRESSION_WITHOUT_COLOR 分辨率5mm3,无颜色,快速在线编码
MED_RES_ONLINE_COMPRESSION_WITH_COLOR 分辨率5mm3,有颜色,快速在线编码
HIGH_RES_ONLINE_COMPRESSION_WITHOUT_COLOR 分辨率1mm3,无颜色,快速在线编码
HIGH_RES_ONLINE_COMPRESSION_WITH_COLOR 分辨率1mm3,有颜色,快速在线编码
LOW_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR 分辨率1cm3,无颜色,高效离线编码
LOW_RES_OFFLINE_COMPRESSION_WITH_COLOR 分辨率1cm3,有颜色,高效离线编码
MED_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR 分辨率5mm3,无颜色,高效离线编码
MED_RES_OFFLINE_COMPRESSION_WITH_COLOR 分辨率5mm3,有颜色,高效离线编码
HIGH_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR 分辨率5mm3,无颜色,高效离线编码
HIGH_RES_OFFLINE_COMPRESSION_WITH_COLOR 分辨率5mm3,有颜色,高效离线编码
MANUAL_CONFIGURATION 允许为高级参数化进行手工配置

如果选择 MANUAL_CONFIGURATION 则需要后面设置参数 。 例如下面的

      /*声明八叉树的压缩 变量  指针*/pcl::io::OctreePointCloudCompression<pcl::PointXYZ> * PointCloudEncoder;/*  进行 八叉树 的 压缩 配置  */PointCloudEncoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZ>(compressionProfile,showStatistics,0.001,0.01,true,100,true,8);//输入参数

进行 八叉树 的 压缩 配置
注意初始化的 参数 后面 加了六个,对应上面写的六个参数

        //压缩的字节流std::stringstream compressedData;/* 实现压缩 的  函数   第一个参数要求时只能指针,  .makeShared()即将cloud转成了 ptr */PointCloudEncoder->encodePointCloud(cloud.makeShared(),compressedData);

调用实现压缩的函数 。第一个参数是 要压缩的点云 第二个参数是 压缩的字节流

       //声明 解压 缩 后的 点云 指针pcl::PointCloud<pcl::PointXYZ>::Ptr cloudOut(new pcl::PointCloud<pcl::PointXYZ>());
    /* 实现 解压缩 的 地方 第一个参数字节流 第二个参数 点云指针*/PointCloudEncoder->decodePointCloud(compressedData,cloudOut);

解压缩点云 的部分

//打印解压缩后的点云坐标std::cout<<"after"<<std::endl;for(size_t i;i<cloudOut->points.size();++i){ std::cout<<"x="<<cloudOut->points[i].x<<"\t"<<"y="<<cloudOut->points[i].y<<"\t"<<"z="<<cloudOut->points[i].z<<std::endl;}

打印解压后的点云数据

Result


可以看到 前后 的 点云 的顺序变了

压缩 pcl::PointXYZRGB 类型数据

之前压缩的是 XYZ类型的数据 。 XYZI类型的数据 会报 encodePointCloud 函数调用错误。
可以 压缩 XYZRGB 的数据

生成XYZRGB的数据

这次构建多个点云数据,通过 代码 生成

    pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr(new pcl::PointCloud<pcl::PointXYZRGB>());;uint8_t r(255), g(15), b(15);for (float z(-1.0); z <= 1.0; z += 0.1){for (float angle(0.0); angle <= 360.0; angle += 60.0){pcl::PointXYZ basic_point;basic_point.x = 0.5 * cosf (float(angle/180*M_PI));basic_point.y = sinf (float(angle/180*M_PI));basic_point.z = z;pcl::PointXYZRGB point;point.x = basic_point.x;point.y = basic_point.y;point.z = basic_point.z;uint32_t rgb = (static_cast<uint32_t>(r) << 16 |static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));point.rgb = *reinterpret_cast<float*>(&rgb);point_cloud_ptr->points.push_back (point);}if (z < 0.0){r -= 12;g += 12;}else{g -= 12;b += 12;}}point_cloud_ptr->width = (int) point_cloud_ptr->points.size ();point_cloud_ptr->height = 1;   pcl::io::savePCDFile("creat_xyzrgb.pcd",*point_cloud_ptr);

自动生成点云。 保存成pcd文件。 点云类型为 pcl::PointXYZRGB

生成pcd文件后可以在终端 通过 pcl_viewer 功能 查看点云


可以看到 6个竖线 ,z逐渐升高。 主要就是上面 for 条件的代码。

压缩和解压

这部分和上一节基本一致 。注意 点云类型一致就可以了

      /* 设置压缩 和解压 时 的结果信息是否打印显示出来  */bool showStatistics = true ;//bool showStatistics = false;/* 压缩选项  可以参考 usr/include/pcl/compression/compression_profiles.h   */    pcl::io::compression_Profiles_e compressionProfile = pcl::io::MANUAL_CONFIGURATION;//设定为允许为高级参数化进行手工配置/*声明八叉树的压缩 变量  指针*/pcl::io::OctreePointCloudCompression<pcl::PointXYZRGB> * PointCloudEncoder;/*  进行 八叉树 的 压缩 配置  */PointCloudEncoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZRGB>(compressionProfile,showStatistics,0.001,0.01,true,100,true,8);//输入参数//压缩的字节流std::stringstream compressedData;/* 实现压缩 的  函数   第一个参数要求时只能指针,  .makeShared()即将cloud转成了 ptr */PointCloudEncoder->encodePointCloud(cloud.makeShared(),compressedData);//声明 解压 缩 后的 点云 指针pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudOut(new pcl::PointCloud<pcl::PointXYZRGB>());/* 实现 解压缩 的 地方 第一个参数字节流 第二个参数 点云指针*/PointCloudEncoder->decodePointCloud(compressedData,cloudOut);

Result

通过

viewer.showCloud(cloudOut);

查看解压后的点云

和压缩前是一致的。

pcl 点云压缩与解压缩相关推荐

  1. 通过pcl 库的八叉树方法实现点云压缩与解压缩

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 为什么要进行点云压缩? 点云带有大量的数据,不仅包括三维信息,还有额外的距离,颜色,法向量等等.此外, ...

  2. 【PCL自学:ocTree】八叉树(octree)的原理及应用案例(点云压缩,搜索,空间变化)

    PCL中八叉树(octree)的原理及应用案例 一.什么是八叉树ocTree? 1.八叉树原理 二.八叉树应用案例 1.点云压缩 2.用八叉树进行空间划分和搜索操作 3.无序点云数据的空间变化检测 一 ...

  3. 实时的激光雷达点云压缩

    点云PCL免费知识星球,点云论文速读. 标题:Real-Time Spatio-Temporal LiDAR Point Cloud Compression 作者:Yu Feng , Shaoshan ...

  4. 编译安装PCL点云库,Kinect2驱动,乐视Astra相机驱动

    编译安装PCL点云库 安装方法一 3d点云安装 apt-cache cearch pcl 安装 sudo apt install 上面查出来的 opencv不建议用以上方法因为需要 安装 opencv ...

  5. PCL中点云关键点提取

    PCL中点云关键点提取 1 关键点概念及相关算法 1.1 NARF关键点 1.2 Harris关键点 1.3 PCL中keypoints模块及类介绍 2 关键点入门级实例解析 2.1 如何从深度图像中 ...

  6. PCL点云库(Point Cloud Library)简介

    PCL点云库(Point Cloud Library)简介 什么是PCL PCL(Point Cloud Library)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了 ...

  7. 《PCL点云库学习VS2010(X64)》Part 45 点云压缩算法—扫描线(DouglasPeuckerAlgorithm)

    <PCL点云库学习&VS2010(X64)>Part 45 点云压缩算法-扫描线(DouglasPeuckerAlgorithm) 道格拉斯-普克算法主要应用有点云滤波.点云压缩. ...

  8. 《PCL点云库学习VS2010(X64)》Part 41 图形学领域的关键算法及源码链接

    <PCL点云库学习&VS2010(X64)>Part 41 图形学领域的关键算法及源码链接 原文链接: Conference papers Graphics Conference ...

  9. PCL点云与深度图像

    PCL点云与深度图像 1 RangeImage概念及相关算法 1.1 深度图像简介 1.2 PCL中RangeImage的相关类 2 从一个点云创建一个深度图像 3 从深度图像中提取边界 4 点云到深 ...

最新文章

  1. 什么是1+N模式的新一代城市大脑建设方案
  2. 新课程网上选课系统V1.0—适用于中小学校本课程选课、选修课选课
  3. win 2003 IIS如何防止代码注入
  4. 【VS开发】【DSP开发】WinDriver简介(或介绍)
  5. 两个时间计算毫秒在线_SPL 的日期时间函数(下)
  6. 轨迹分析_单细胞轨迹分析知多少拟时间分析比较
  7. java web实现页面跳转页面_JavaWeb过滤器实现页面跳转至登录页面
  8. 模型部署到移动端_Pytorch1.4来了!定制移动端构建、支持分布式模型并行训练等...
  9. 又一编辑神器-百度编辑器-Ueditor
  10. Byte数组转换成string 的方法积累
  11. [翻译]2005年软件业界推出新产品非官方计划
  12. layoutSubviews调用
  13. 火灾火焰检测数据集和yolov4检测模型
  14. WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案
  15. linux超级终端root权限,linux超级终端命令
  16. mosse(Minimizing the Output Sum of Squared Error)论文解读
  17. 《C专家编程》读书笔记(1)
  18. 现代计算机的存储体系 (转载)
  19. 小学生机器人挑战赛_适合小学生参加的机器人比赛有哪些?
  20. ttl传输种过期_ttl传输中过期是什么意思怎么解决

热门文章

  1. 普源DS1072U示波器70MHz带宽,500MSa/s采样率
  2. 小米Pro 15.6 系统重装记录
  3. 3D Tiles Next CesiumJS 路线图
  4. 2011分区联赛模拟试题 电子眼【树形DP】
  5. Final Cut Pro 里视频/图片的颜色反转如何设置
  6. Python计时库——Time库的使用详解
  7. linux快速同步多台服务器之间的数据scp和rsync命令用法
  8. 年后找工作的你,如何写一封好的简历?
  9. c语言字符串输入输出函数总结
  10. ERP系统帮助企业解决物料清单管理难题