压缩点云数据

压缩分辨率参数

  • LOW_RES_ONLINE_COMPRESSION:低分辨率的在线压缩模式,不保留颜色信息。

  • MED_RES_ONLINE_COMPRESSION:中等分辨率的在线压缩模式,不保留颜色信息。

  • HIGH_RES_ONLINE_COMPRESSION:高分辨率的在线压缩模式,不保留颜色信息。

  • LOW_RES_OFFLINE_COMPRESSION:低分辨率的离线压缩模式,不保留颜色信息。

  • MED_RES_OFFLINE_COMPRESSION:中等分辨率的离线压缩模式,不保留颜色信息。

  • HIGH_RES_OFFLINE_COMPRESSION:高分辨率的离线压缩模式,不保留颜色信息。

  • LOW_RES_ONLINE_COMPRESSION_WITH_COLOR:低分辨率的在线压缩模式,保留颜色信息。

  • MED_RES_ONLINE_COMPRESSION_WITH_COLOR:中等分辨率的在线压缩模式,保留颜色信息。

  • HIGH_RES_ONLINE_COMPRESSION_WITH_COLOR:高分辨率的在线压缩模式,保留颜色信息。

  • LOW_RES_OFFLINE_COMPRESSION_WITH_COLOR:低分辨率的离线压缩模式,保留颜色信息。

  • MED_RES_OFFLINE_COMPRESSION_WITH_COLOR:中等分辨率的离线压缩模式,保留颜色信息。

  • HIGH_RES_OFFLINE_COMPRESSION_WITH_COLOR:高分辨率的离线压缩模式,保留颜色信息。

在线压缩vs离线压缩

在线压缩和离线压缩是指在不同的应用场景下进行点云数据压缩的方式。

  1. 在线压缩:在线压缩是指在数据生成的同时进行压缩。这种压缩方式通常应用于点云数据实时采集和传输的场景。在在线压缩中,点云数据被即时地压缩,然后通过网络或其他传输方式进行实时传输或实时处理。在线压缩通常需要快速的压缩算法和较低的压缩延迟,以适应实时的数据处理需求。

  2. 离线压缩:离线压缩是指在数据生成之后进行压缩。这种压缩方式通常应用于点云数据离线存储和分析的场景。在离线压缩中,点云数据在生成之后,通过离线的方式进行压缩和存储,然后在需要的时候进行解压缩和处理。离线压缩通常对压缩速度和压缩效率有更高的要求,允许较长的压缩时间以换取更好的压缩率。

在实际应用中,选择在线还是离线压缩需要根据具体场景和需求进行权衡。在线压缩适用于实时数据采集和传输,可以减小带宽需求和传输延迟;离线压缩适用于离线数据存储和批量处理,可以节省存储空间和提高数据处理效率。根据应用需求、存储/传输条件和处理效率等方面的考虑,选择相应的压缩方式有助于最大程度地满足点云数据的存储、传输和处理需求。

压缩点云代码

#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/compression/octree_pointcloud_compression.h>

int main()
{
    // 点云数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

    cloud->width = 128;
    cloud->height =1;
    cloud->points.resize(cloud->width * cloud->height);

    for (size_t i=0; i<cloud->size(); i++){
        cloud->points[i].x = 1024.0f * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].y = 1024.0f * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].z = 1024.0f * rand() / (RAND_MAX + 1.0f);
    }

    //压缩参数
    pcl::io::compression_Profiles_e compressionProfile = pcl::io::MED_RES_OFFLINE_COMPRESSION_WITH_COLOR;
    double pointResolution = 0.001;


    // 创建压缩对象
    pcl::io::OctreePointCloudCompression<pcl::PointXYZ> compress(compressionProfile,
                                                                 true, // 是否进行体素网络下采样
                                                                 0.01);// 八叉树分辨率
    // 压缩点云数据
    std::stringstream compressData;
    compress.encodePointCloud(cloud, compressData);

    // 存储压缩数据
    std::ofstream outfile("compressed_cloud.pcc");
    outfile.write((char*)compressData.str().c_str(), compressData.str().length());
    outfile.close();

    // 解码压缩数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr decodeCloud(new pcl::PointCloud<pcl::PointXYZ>);
    compress.decodePointCloud(compressData, decodeCloud);

    // 将解码后的点云数据保存为PCD文件
    pcl::io::savePCDFileASCII("decoded_cloud.pcd", *decodeCloud);
    std::cout << "Point cloud compression complete." << std::endl;
    return 0;


}

 解压缩点云代码

#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/compression/octree_pointcloud_compression.h>


// -------------------------
// 读取保存的压缩的点云数据文件
// ------------------------
int main()
{
    // 创建一个ifstream对象,准备从文件读取数据
    std::ifstream infile("compressed_cloud.pcc");

    // 检查文件是否成功打开
    if (!infile){
        std::cerr << "Cloud not open file." << std::endl;
        return  -1;
    }

    // stringstream对象,用于存储从文件读取到的数据
    std::stringstream decompressData;
    decompressData << infile.rdbuf(); // infile.rbuf()返回文件infile的内部缓冲区指针,<< 操作符将其内容存储到decompressDate

    // 创建一个pcl::io::OctreePointCloudCompression对象,用于对点云数据压缩和解压缩
    pcl::io::OctreePointCloudCompression<pcl::PointXYZ> compress;

    // 解压缩 (解码)
    pcl::PointCloud<pcl::PointXYZ>::Ptr decodeCloud(new pcl::PointCloud<pcl::PointXYZ>);
    compress.decodePointCloud(decompressData, decodeCloud);

    // 解压缩后数据保存为PCD文件
    pcl::io::savePCDFileASCII("decode_cloud.pcd", *decodeCloud);
    std::cout << "Point cloud compression complete." << std::endl;

    return 0;


}

猜你喜欢

转载自blog.csdn.net/weixin_45824067/article/details/131481800
今日推荐