(十二)OcTree教程四--OcTree在PCL中的应用-点云压缩

点云压缩

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

下面我们将一个点云进行压缩,压缩的结果是一个StringStream,然后再将它解压并显示出来。

步骤

头文件

#include <pcl/compression/octree_pointcloud_compression.h>
  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;
  • 使用配置文件进行参数配置
    配置文件预先为点云压缩定义了参数,它们针对通过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:定义每一个彩色成分编码后所占的位数

    1. 压缩
// 压缩点云
PointCloudEncoder->encodePointCloud(sourceCloud.makeShared(), compressedData);
  1. 解压
// 解压点云
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;
}

运行结果

猜你喜欢

转载自blog.csdn.net/jiaojialulu/article/details/69351049