切割pcd 文件

本文介绍了如何处理大型las文件无法直接打开的问题。通过将pcd文件分割成小块,然后逐个转换为las文件,最终合并为一个las文件。详细步骤包括使用pcl库进行PCD文件的读取、写入、分割和合并操作,适用于大规模点云数据的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

用软件对las文件进行标定的时候发现las文件太大打不开


解决方案:

将转化成las文件的pcd切分成几个小块。然后再转化成las文件,最后再将las文件合并。

具体操作

思路

pcd转换成pcl::PointCloud<pcl::PointXYZ>::Ptr 的cloud,然后读取cloud, 将cloud 分成小块保存成PCD
依赖的头文件如下:

PCD文件IO操作

由于pcd点云数据格式有它独特的优势,因此本项目基于此继续研究。首先是对点云数据的IO处理,包括从PCD文件读取点云数据和写入点云数据。

#include <iostream>
#include <pcl/io/pcd_io.h>  //PCD读写类相关的头文件
#include <pcl/point_types.h>    //PCL中支持的点类型头文件
PCD文件的读取操作

法一:使用loadPCDFile

读取milk.pcd文件,若文件不存在,返回错误。此处读取数据采用的是相对路径。

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>("milk.pcd", *cloud) == -1)
    {
        std::cout << "Cloud reading failed." << std::endl;
        return (-1);
    }

法二:使用reader

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCDReader reader;   
reader.read("E://box1.pcd", *cloud);
PCD文件的写入操作

法一:使用writer

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCDWriter writer;
writer.write<pcl::PointXYZ>("test_pcd.pcd", *cloud, false);

法二:使用savePCDFileASCII

pcl::PointCloud<pcl::PointXYZ> cloud;
pcl::io::savePCDFileASCII("test_pcd.pcd",cloud);

参考链接: https://cloud.tencent.com/developer/article/1688130

要用Qt运行代码前,首先要配置相关的依赖库,具体配置可参考下面的链接:
https://blog.youkuaiyun.com/CCCrunner/article/details/118653184?spm=1001.2014.3001.5501

最后上代码:
其中 pointCount_ 是总点云数量
blockNum是分成几块
blockSize是每一块pcd的点云数量
map_test.pcd 是被分割的pcd文件名字

#include <QCoreApplication>
#include <iostream>
#include <pcl/io/pcd_io.h>  //PCD读写类相关的头文件
#include <pcl/point_types.h>    //PCL中支持的点类型头文件

int main(int argc, char *argv[])
{
    int pointCount_ = 0; // PointCloud number
    int blockNum = 0;
    int blockSize = 1200000;

    QCoreApplication a(argc, argv);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ> cloud1;
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("map_test.pcd", *cloud) == -1) //Failed to read pcd File
    {
        std::cout << "Cloud reading failed." << std::endl;
        return (-1);
    }
    else
    {
        std::cout << "Cloud reading success!" << std::endl;
        cloud1 = *cloud;
        pointCount_ = cloud1.points.size();

        blockNum = pointCount_/blockSize; //Slip groups number
        int block_groups[blockNum+1];
        int begin = 0;
        block_groups[0] = 0;
        std::cout<<"block"<<blockNum<<std::endl;
        for(size_t i=1;i<=blockNum;i++)
        {
            block_groups[i] = block_groups[i-1]+1200000;
            std::cout<<block_groups[i]<<std::endl;
        }
        block_groups[blockNum+1] = pointCount_;

        pcl::PointCloud<pcl::PointXYZ> tempCloud;
        for(size_t i = 0;i<=blockNum+1;i++){
            std::cout<<block_groups[i]<<std::endl;
        }
        for(size_t j = 1;j<=blockNum+1;j++){

             tempCloud.height = 1;
             tempCloud.width = block_groups[j] - block_groups[j-1];
             tempCloud.is_dense = true;
             tempCloud.points.resize(tempCloud.width * tempCloud.height);
             for(size_t i=block_groups[j-1];i<=block_groups[j];i++){
                 std::cout<<i<<std::endl;
                 tempCloud.points[i].x = cloud1.points[i].x;
                 tempCloud.points[i].y = cloud1.points[i].y;
                 tempCloud.points[i].z = cloud1.points[i].z;
             }
             std::string map_name = "map"+std::to_string(j)+".pcd";
             std::cout<<"map_name = "<<map_name<<std::endl;
             pcl::io::savePCDFileASCII (map_name, tempCloud);
             std::cout<<"pcd create"<<std::endl;

        }

        //cloud = cloud1.makeShared();
    }
    std::cout<<"cloud1.height = "<<cloud1.height<<std::endl;
    std::cout<<"cloud1.width = "<<cloud1.width<<std::endl;
    std::cout<<"cloud1.is_dense = "<<cloud1.is_dense<<std::endl;

    return a.exec();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Philtell

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值