PCL基础:加载点云数据和保存点云数据,包含pcd、obj、ifs、ply等文件类型,附带示例代码,一篇文章掌握PCL文件流用法

创作不易,如果本篇文章能够给你提供帮助,请点赞鼓励+收藏备查+关注获取最新技术动态,支持作者输出高质量干货!(一般在周末更新技术干货)

一、引言

        在点云处理领域,Point Cloud Library(PCL)是一个强大且广泛使用的开源库。加载和保存不同格式的点云数据是点云处理的基础操作,本文将详细介绍如何使用PCL加载和保存常见的点云文件格式,包括PCD、OBJ、IFS、PLY等。

二、环境准备

        在开始之前,你需要确保已经安装了PCL库。如果还未安装,可以参考PCL官方文档进行安装。同时,要创建一个C++项目,并包含PCL相关的头文件和库。

三、代码示例

#include <iostream> 
#include <pcl/io/pcd_io.h> 
#include <pcl/io/obj_io.h> 
#include <pcl/io/ifs_io.h> 
#include <pcl/io/ply_io.h> 
#include <pcl/point_types.h> 

// 主函数,程序入口 
int main(int argc, char** argv) 
{ 
    // 创建点云对象指针,用于存储点云数据 
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); 
    // 加载不同格式的点云数据 
    // 加载PCD文件 
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("input_cloud.pcd", *cloud) == -1) 
    { 
        PCL_ERROR("Couldn't read the PCD file\n"); 
        return -1; 
    } 
    std::cout << "Loaded PCD file with " << cloud->points.size() << " points." << std::endl; // 加载OBJ文件 
    if (pcl::io::loadOBJFile<pcl::PointXYZ>("input_cloud.obj", *cloud) == -1) 
    { 
        PCL_ERROR("Couldn't read the OBJ file\n"); 
        return -1; 
    } 
    std::cout << "Loaded OBJ file with " << cloud->points.size() << " points." << std::endl; 
    // 加载IFS文件 
    if (pcl::io::loadIFSFile<pcl::PointXYZ>("input_cloud.ifs", *cloud) == -1) 
    { 
        PCL_ERROR("Couldn't read the IFS file\n"); 
        return -1; 
    } 
    std::cout << "Loaded IFS file with " << cloud->points.size() << " points." << std::endl; 
    // 加载PLY文件 
    if (pcl::io::loadPLYFile<pcl::PointXYZ>("input_cloud.ply", *cloud) == -1) 
    { 
        PCL_ERROR("Couldn't read the PLY file\n"); 
        return -1; 
    } 
    std::cout << "Loaded PLY file with " << cloud->points.size() << " points." << std::endl; 
    // 保存点云数据到不同格式的文件 
    // 保存为PCD文件 
    if (pcl::io::savePCDFileASCII("output_cloud.pcd", *cloud) == -1) 
    { 
        PCL_ERROR("Couldn't save the PCD file\n"); 
        return -1; 
    } 
    std::cout << "Saved PCD file with " << cloud->points.size() << " points." << std::endl; 
    // 保存为OBJ文件 
    if (pcl::io::saveOBJFile("output_cloud.obj", *cloud) == -1) 
    { 
        PCL_ERROR("Couldn't save the OBJ file\n"); 
        return -1; 
    } 
    std::cout << "Saved OBJ file with " << cloud->points.size() << " points." << std::endl; 
    // 保存为IFS文件 
    if (pcl::io::saveIFSFile("output_cloud.ifs", *cloud) == -1) 
    { 
        PCL_ERROR("Couldn't save the IFS file\n"); 
        return -1; 
    } 
    std::cout << "Saved IFS file with " << cloud->points.size() << " points." << std::endl; 
    // 保存为PLY文件 
    if (pcl::io::savePLYFileASCII("output_cloud.ply", *cloud) == -1) 
    { 
        PCL_ERROR("Couldn't save the PLY file\n"); 
        return -1; 
    } 
    std::cout << "Saved PLY file with " << cloud->points.size() << " points." << std::endl; 
    return 0; 
}

四、代码解释

1. 头文件包含

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/io/ifs_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>        

- `iostream`:用于标准输入输出操作,方便输出信息。

- `pcl/io/pcd_io.h`:提供了PCL中处理PCD文件的函数。

- `pcl/io/obj_io.h`:用于处理OBJ文件。

- `pcl/io/ifs_io.h`:处理IFS文件。

- `pcl/io/ply_io.h`:处理PLY文件。

- `pcl/point_types.h`:包含了PCL中各种点类型的定义,这里使用`pcl::PointXYZ`表示只包含三维坐标的点。 

2. 点云对象创建

        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

        创建一个指向`pcl::PointCloud<pcl::PointXYZ>`类型的智能指针`cloud`,用于存储点云数据。

3. 加载点云数据
if (pcl::io::loadPCDFile<pcl::PointXYZ>("input_cloud.pcd", *cloud) == -1) 
{ 
    PCL_ERROR("Couldn't read the PCD file\n"); 
    return -1; 
}

        使用`pcl::io::loadPCDFile`函数加载PCD文件,如果加载失败,函数返回 -1,程序输出错误信息并终止。类似地,使用`pcl::io::loadOBJFile`、`pcl::io::loadIFSFile`和`pcl::io::loadPLYFile`分别加载OBJ、IFS和PLY文件。

4. 保存点云数据
if (pcl::io::savePCDFileASCII("output_cloud.pcd", *cloud) == -1)
{ 
    PCL_ERROR("Couldn't save the PCD file\n"); 
    return -1;
}

        使用`pcl::io::savePCDFileASCII`函数将点云数据保存为ASCII格式的PCD文件,如果保存失败,函数返回 -1,程序输出错误信息并终止。同样,使用`pcl::io::saveOBJFile`、`pcl::io::saveIFSFile`和`pcl::io::savePLYFileASCII`分别保存为OBJ、IFS和PLY文件。

五、注意事项

- **文件路径**:

        要确保输入文件存在于指定路径,或者使用完整的文件路径。

- **文件格式兼容性**:

        不同的文件格式可能支持不同的点云属性,如颜色、法线等。在加载和保存文件时,要确保点云数据的属性与文件格式兼容。

- **文件保存格式**:

        PCL提供了ASCII和二进制两种保存格式,`savePCDFileASCII`和`savePLYFileASCII`保存为ASCII格式,`savePCDFileBinary`和`savePLYFileBinary`保存为二进制格式。二进制格式通常占用空间更小,读写速度更快

        通过以上步骤,你可以掌握使用PCL加载和保存常见点云文件格式的基本方法。    

原创内容的创作过程凝聚了大量心血,若本文内容对您的技术实践有所助益,恳请通过点赞鼓励、收藏备查、关注获取最新技术动态等方式,支持作者持续输出高质量技术干货。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

多宝Kim

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

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

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

打赏作者

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

抵扣说明:

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

余额充值