点云压缩
点云带有大量的数据,不仅包括三维信息,还有额外的距离,颜色,法向量等等。此外,点云可以快速生成,这会占有大量的内存资源。一旦点云必须被存储或者用于通信传输,对于点云的压缩技术就显得十分重要了。PCL提供了点云压缩功能,它支持对各种类型点云的压缩,其中包括无序点云,此外,在八叉树结构下的数据支持高效地合并多个来自不同数据源的点云。
下面我们将一个点云进行压缩,压缩的结果是一个StringStream,然后再将它解压并显示出来。
步骤
头文件
#include <pcl/compression/octree_pointcloud_compression.h>
- 设置配置信息,初始化编码器
// 是否查看压缩信息
bool showStatistics = true;
// 配置文件,如果想看配置文件的详细内容,可以参考: /io/include/pcl/compression/compression_profiles.h
pcl::io::compression_Profiles_e compressionProfile = pcl::io::MED_RES_ONLINE_COMPRESSION_WITH_COLOR;
- 使用配置文件进行参数配置
配置文件预先为点云压缩定义了参数,它们针对通过OpenNI获取器获得的点云进行了压缩的优化。
注意:解压器没有必要输入这些参数,因为它可以通过检测并适应压缩时用的参数。
下面是我们可以使用的一些压缩文件:
- LOW_RES_ONLINE_COMPRESSION_WITHOUT_COLOR:分辨率1立方厘米,压缩完之后无颜色,快速在线编码
- LOW_RES_ONLINE_COMPRESSION_WITH_COLOR:分辨率1立方厘米,压缩完之后有颜色,快速在线编码
- MED_RES_ONLINE_COMPRESSION_WITHOUT_COLOR:分辨率5立方毫米,压缩完之后无颜色,快速在线编码
- MED_RES_ONLINE_COMPRESSION_WITH_COLOR:分辨率5立方毫米,压缩完之后有颜色,快速在线编码
- HIGH_RES_ONLINE_COMPRESSION_WITHOUT_COLOR:分辨率1立方毫米,压缩完之后无颜色,快速在线编码
- HIGH_RES_ONLINE_COMPRESSION_WITH_COLOR:分辨率1立方毫米,压缩完之后有颜色,快速在线编
- LOW_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR:分辨率1立方厘米,压缩完之后无颜色,高效离线编码
- LOW_RES_OFFLINE_COMPRESSION_WITH_COLOR:分辨率1立方厘米,压缩完之后有颜色,高效离线编码
- MED_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR:分辨率5立方毫米,压缩完之后无颜色,高效离线编码
- MED_RES_OFFLINE_COMPRESSION_WITH_COLOR:分辨率5立方毫米,压缩完之后有颜色,高效离线编码
- HIGH_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR:分辨率1立方毫米,压缩完之后无颜色,高效离线编码
- HIGH_RES_OFFLINE_COMPRESSION_WITH_COLOR:分辨率1立方毫米,压缩完之后有颜色,高效离线编码
- 高级参数化进行参数配置
直接在编码器构造时,输入各项参数:
OctreePointCloudCompression (compression_Profiles_e compressionProfile_arg = MED_RES_ONLINE_COMPRESSION_WITH_COLOR,
bool showStatistics_arg = false,
const double pointResolution_arg = 0.001,
const double octreeResolution_arg = 0.01,
bool doVoxelGridDownDownSampling_arg = false,
const unsigned int iFrameRate_arg = 30,
bool doColorEncoding_arg = true,
const unsigned char colorBitResolution_arg = 6) :
- compressionProfile_arg:配置文件,若要启用高级参数化应设置为MANUAL_CONFIGURATION
- showStatistics_arg:是否将压缩相关的统计信息打印到标准输出上
- octreeResolution_arg:八叉树分辨率
- pointResolution_arg:定义点坐标的编码精度,该参数应设为小于传感器精度的一个值
- doVoxelGridDownDownSampling_arg:是否进行体素下采样(每个体素内只留下体素中心一个点)
- iFrameRate_arg:点云压缩模式对点云进行差分编码压缩,用这种方法对新引入的点云和之前编码的点云之间的差分进行编码,以便获得最大压缩性能,iFrameRate_arg指定了一个速率,如果数据流中的帧速率低于这个速率则不进行差分编码压缩
- doColorEncoding_arg:是否对彩色编码压缩
colorBitResolution_arg:定义每一个彩色成分编码后所占的位数
- 压缩
// 压缩点云
PointCloudEncoder->encodePointCloud(sourceCloud.makeShared(), compressedData);
- 解压
// 解压点云
PointCloudEncoder->decodePointCloud(compressedData, cloudOut);
程序
/*
功能:利用octree进行点云压缩和解压
*/
#include <pcl/compression/octree_pointcloud_compression.h>
#include <pcl/point_cloud.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/pcd_io.h>
#include <iostream>
int main()
{
// 加载点云
pcl::PointCloud<pcl::PointXYZRGB> sourceCloud;
if (pcl::io::loadPCDFile("coloredBox.pcd", sourceCloud) == -1)
return -1;
// 是否查看压缩信息
bool showStatistics = true;
// 配置文件,如果想看配置文件的详细内容,可以参考: /io/include/pcl/compression/compression_profiles.h
pcl::io::compression_Profiles_e compressionProfile = pcl::io::MED_RES_ONLINE_COMPRESSION_WITH_COLOR;
// 初始化点云压缩器和解压器
pcl::io::OctreePointCloudCompression<pcl::PointXYZRGB>* PointCloudEncoder;
PointCloudEncoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZRGB>(compressionProfile, showStatistics);
PointCloudEncoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZRGB>(compressionProfile,true,0.002);
// 压缩结果stringstream
std::stringstream compressedData;
// 输出点云
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudOut(new pcl::PointCloud<pcl::PointXYZRGB>());
// 压缩点云
PointCloudEncoder->encodePointCloud(sourceCloud.makeShared(), compressedData);
std::cout << compressedData.str() << std::endl;
// 解压点云
PointCloudEncoder->decodePointCloud(compressedData, cloudOut);
pcl::visualization::CloudViewer viewer("Simple Cloud Viewer");
viewer.showCloud(cloudOut);
while (!viewer.wasStopped())
{
}
std::system("pause");
return 0;
}