点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达

为什么要进行点云压缩?

点云带有大量的数据,不仅包括三维信息,还有额外的距离,颜色,法向量等等。此外,点云可以快速生成,这会占有大量的内存资源。一旦点云必须被存储或者用于通信传输,对于点云的压缩技术就显得十分重要了。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个参数。

pointResolution 点的分辨率该变量决定了点的坐标在编码时可以精确的程度,但是该变量只在进行细节编码(detail coding)时才会生效。

octreeResolution划分八叉树时最小块。

doVoxelGridDownDownSampling 是否对点云文件进行下采样。为true时,对点云文件进行下采样,以体素的中心点的坐标来代替整个体素内的点的坐标,而颜色则以体素内所有点的颜色的均值为代表,此时pointResolution不会生效。为false时,则进行细节编码,即编码一个体素内的具体坐标与颜色,实现方式是计算体素内每个点到体素左下角的偏移量,并通过整除pointResolution来得到整数坐标,而颜色则需编码体素内每个点的颜色相对于平均值的残差。

iFrameRate 用来决定进行I帧编码的频率,如果此数值为30,则每隔30帧进行一次I帧编码,中间的帧则进行P帧编码。

colorBitResolution 表示颜色的RGB的保留的有效位数;doColorEncoding 决定是否进行颜色编码。

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

如果选择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);

查看解压后的点云,

和压缩前是一致的。

本文仅做学术分享,如有侵权,请联系删文。

下载1

在「3D视觉工坊」公众号后台回复:3D视觉即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。

下载2

在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。

下载3

在「3D视觉工坊」公众号后台回复:相机标定即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配即可下载独家立体匹配学习课件与视频网址。

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、orb-slam3等视频课程)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

通过pcl 库的八叉树方法实现点云压缩与解压缩相关推荐

  1. pcl 点云压缩与解压缩

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

  2. VC6 下 libpng 库的编译与初步使用以及压缩与解压缩

    VC6 下 libpng 库的编译与初步使用 目录 libong 库的介绍 VC6 下 libpng 的编译 下载 libpng 与 zlib 进行编译 得到 .lib 文件 初步使用 对 VC6 进 ...

  3. 学习PCL库:PCL库中的IO模块介绍

    公众号致力于点云处理,SLAM,三维视觉,高精地图等领域相关内容的干货分享,欢迎各位加入,有兴趣的可联系dianyunpcl@163.com.未经作者允许请勿转载,欢迎各位同学积极分享和交流. IO模 ...

  4. (曲率系列3:)PCL:PCL库中的两种曲率表示方法pcl::NormalEstimation和PrincipalCurvaturesEstimation

    PCL里有两个计算曲率的调用函数: (1)pcl::NormalEstimation 这里边计算的曲率不是数学上定义的曲率. (2)pcl::PrincipalCurvaturesEstimation ...

  5. 基于PCL库的通过ICP匹配多幅点云方法

    基于PCL库的通过ICP匹配多幅点云方法 前言 Code Result 前言 PCL库中有很多配准的方式,主要都是基于ICP ICP算法最初由Besl和Mckey提出,是一种基于轮廓特征的点配准方法. ...

  6. 学习PCL库你应该知道的C++特性

    要学会PCL首先要对C++进行学习,所以这里我们首先对PCL库的代码中常见的C++的技巧进行整理和概述,并且对其中的难点进行细化讲解.首先我们搞清楚PCL库的文件形式.是一个以CMake构建的项目,库 ...

  7. PCL库官方教程01

    PCL 库概览 介绍 PCL 库的组件,简短说明各个模块的功能及其之间的交互. 概述 PCL 被拆分为多个模块化库.主要模块如下图所示: Filters 滤波器 下图给出了一个去除噪声的例子.由于测量 ...

  8. PCL学习笔记1 —— PCL库简要说明

    本文转载 https://www.cnblogs.com/li-yao7758258/p/6441763.html PCL(PointCloudLibrary)是在吸收了前人点云相关研究基础上建立起来 ...

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

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

最新文章

  1. 微擎删除分类无法删除解决-select in效率低解决办法
  2. Pandas:透视表(pivotTab)和交叉表(crossTab)
  3. 用Netscaler的Variable和Assignment来实现计数控制
  4. 从汉诺塔讲递归的思考方式
  5. iOS.Animations.by.Tutorials.v2.0汉化
  6. 031_div和span
  7. 【参数】REMOTE_LOGIN_PASSWORDFILE参数三种取值及其行为特性分析
  8. 修改linux文件权限命令:chmod
  9. cake fork什么意思_Java7任务并行执行神器:Forkamp;Join框架
  10. 如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)- 续(附demo)
  11. “~/” 代表应用程序根目录的一点误区
  12. AI前导课-第一课AI概览(2018/10/20)
  13. CSipIm断网重连崩溃原因分析
  14. Mac上配置Privoxy
  15. mysql 参考文献_后记amp;参考文献
  16. 【二叉树】用python实现AVL树
  17. 女友让我每天半夜十二点给她发晚安?我用 Python 做了个定时发消息神器!怕她干嘛!
  18. 【正点原子FPGA连载】 第二十章 LCD触摸屏实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
  19. 如何把word里的分页符、换行符替换成回车符?
  20. linux猜数字代码,Shell脚本实现猜数字游戏

热门文章

  1. dsp-asic-fpga
  2. 查找二叉树中出现次数最多的数 Find Mode in Binary Search Tree
  3. Commvault公司营收增长 但本季度仍身陷亏损
  4. javascript-行间样式,提取行间事件,while/for,全选/反选/取消,选项卡,innerHTML
  5. Outlook Hotmail Connector
  6. Twitter 广告平台实时计费系统的架构增强之道
  7. 字节总监的开发手记,知乎5000+点赞!
  8. 阿里Java岗P5-P7成长笔记【3283页PDF文档】
  9. Java问题排查工具清单!
  10. 分布式、服务化的ERP系统架构设计