PCL教程指南-读取PCD文件,写入PCD文件,合并点云

本文介绍了如何使用PCL库进行点云数据的读取、写入及合并操作。首先通过示例代码展示了如何加载PCD文件到点云对象,并验证读取是否成功。随后讲解了如何创建点云对象并将其保存为PCD文件。最后,说明了两种合并点云的方法:一种是将两个点云按XYZ轴纵向合并;另一种是在现有点云的基础上增加新的字段。

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

PCL教程指南-读取PCD文件,写入PCD文件,合并点云

一.读取PCD文件

读取PCD应用pcl::io::loadPCDFile<pcl::PointT>(pcd文件,点云对象)函数,针对官方文档代码进行注释解释

#include <iostream>			
#include <pcl/io/pcd_io.h>    //pcd流头文件
#include <pcl/point_types.h>  //点类型即现成的pointT

int
main (int argc, char** argv)
{
 //创建点云指针
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
 //直接读取pcd文件到cloud中,并判断是否读取正确
  if (pcl::io::loadPCDFile<pcl::PointXYZ> ("test_pcd.pcd", *cloud) == -1) //* load the file
  {
    PCL_ERROR ("Couldn't read file test_pcd.pcd \n");
    return (-1);
  }
  //控制台输出点云宽高(无序点云为总数)
  std::cout << "Loaded "
            << cloud->width * cloud->height
            << " data points from test_pcd.pcd with the following fields: "
            << std::endl;
   //遍历点云输出坐标
  for (const auto& point: *cloud)
    std::cout << "    " << point.x
              << " "    << point.y
              << " "    << point.z << std::endl;

  return (0);
}

二.写入PCD文件

将点云写入PCD文件应用pcl::io::savePCDFileASCII (pcd文件, 点云对象)函数

注意:写入的代码点云对象不是指针所以与读取代码略有不同,具体栈和堆创建区别自行查找C++基础

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

int
  main (int argc, char** argv)
{
 //创建栈上的点云对象
  pcl::PointCloud<pcl::PointXYZ> cloud;

  //为点云基础属性赋值;
  cloud.width    = 5;//总数
  cloud.height   = 1;
  cloud.is_dense = false;//是否有限,即是否包含NAN或者INF
  cloud.points.resize (cloud.width * cloud.height);//更新点云内部存储结构大小
//随机为每个点赋值
  for (auto& point: cloud)
  {
    point.x = 1024 * rand () / (RAND_MAX + 1.0f);
    point.y = 1024 * rand () / (RAND_MAX + 1.0f);
    point.z = 1024 * rand () / (RAND_MAX + 1.0f);
  }
//将cloud存入pcd文件中
  pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud);
  std::cerr << "Saved " << cloud.size () << " data points to test_pcd.pcd." << std::endl;
//控制台输出
  for (const auto& point: cloud)
    std::cerr << "    " << point.x << " " << point.y << " " << point.z << std::endl;

  return (0);
}

三.合并点云数据

由于官方文档代码过长,大部分都是随机创建数据,只提取关键部分;
点云合并的官方文档
(小白提示:官方文档中合并的代码整个流程即对A和B两个点云的位置XYZ纵向合并对A点云的位置XYZ字段与B点云的法向量XYZ字段横向合并

  • 对于纵向合并,直接A+B即可
  • 横向字段合并,采用pcl::concatenateFields (cloud_a, n_cloud_b, p_n_cloud_c);
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值