从PCD文件读取点云数据

 学习记录:

 #include <iostream>			//C++标准库中输入输出的头文件
 #include <pcl/io/pcd_io.h>		//pcd读写类相关的头文件
 #include <pcl/point_types.h>	//pcl中支持的点类型的头文件
 
 int
 main ()
 {
     /*创建一个 PointCloud<PointXYZ> boost 共享指针并对其进行初始化。
     pcl::PointCloud<pcl::PointXYZ>::Ptr:这是定义一个智能指针,
     指向一个pcl::PointCloud<pcl::PointXYZ>类型的对象。
     智能指针是C++中的一种对象,可以自动管理内存,以防止内存泄漏。
     这里使用的是std::shared_ptr,它是一种智能指针,可以共享所有权,当没有任何智能指针指向一个对象时,该对象将被自动删除。
     cloud:这是定义的智能指针变量的名称。
     (new pcl::PointCloud<pcl::PointXYZ>)
     这是创建一个新的pcl::PointCloud<pcl::PointXYZ>类型的对象。
     new关键字用于动态分配内存,以创建对象。分配的内存将在cloud智能指针销毁时自动释放,
     以防止内存泄漏。*/
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

     /*打开点云文件,pcl::io::loadPCDFile<pcl::PointXYZ> ("test_pcd.pcd", *cloud)
     这是PCL库中的一个函数,用于加载PCD文件。
     函数中的<pcl::PointXYZ>是指定点云数据类型的模板参数,
     表示加载的PCD文件中的点云数据是pcl::PointXYZ类型。
     "test_pcd.pcd"是要加载的PCD文件的文件名,
     *cloud是一个指向点云对象的指针,函数将加载的点云数据存储在该对象中。
     这是一个if语句,用于检查PCD文件是否成功加载。
     如果函数返回值是-1,则表示文件加载失败。*/
  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);/*如果文件加载失败,这个代码块将被执行。PCL_ERROR是一个宏,用于输出错误信息。
    return (-1)语句表示函数返回-1,表示程序执行失败。*/
  }

     /*默认就是二进制块读取转换为模块化的PointCLoud格式里pcl::PointXYZ作为点类型  
     然后打印出来。*/
  std::cout << "Loaded "
            << cloud->width * cloud->height
            << " data points from test_pcd.pcd with the following fields: "
            << std::endl;

     /*for (const auto& point: *cloud): 这是一个范围for循环,
     它遍历cloud指向的点云数据集中的每个点。const auto& point表示每个点的引用,
     这样可以在循环体内直接修改每个点的值(尽管在这个例子中并没有修改任何点的值)。
     std::cout<< " " <<point.x <<" " <<point.y <<" " <<point.z <<std::endl;
     这行代码用于打印每个点的坐标。它首先打印四个空格(用于缩进),
     然后打印每个点的x、y、z坐标,最后打印一个换行符,以便每个点的坐标都打印在新的行上。*/
  for (const auto& point: *cloud)
    std::cout << "    " << point.x
              << " "    << point.y
              << " "    << point.z << std::endl;

  return (0);
}

 运行结果:

pcl::PCLPointCloud2 cloud_blob;
pcl::io::loadPCDFile ("test_pcd.pcd", cloud_blob);
pcl::fromPCLPointCloud2 (cloud_blob, *cloud); //* convert from pcl/PCLPointCloud2 to pcl::PointCloud<T>

这段代码是使用Point Cloud Library (PCL)库来加载和转换PCD文件中的点云数据。

        1.pcl::PCLPointCloud2 cloud_blob;

这行代码定义了一个名为cloud_blob的变量,其类型为pcl::PCLPointCloud2。PCLPointCloud2是PCL库中用于表示点云数据的类。

        2.pcl::io::loadPCDFile ("test_pcd.pcd", cloud_blob);

这行代码使用pcl::io::loadPCDFile函数从名为“test_pcd.pcd”的文件中加载点云数据,并将加载的数据存储在cloud_blob变量中。

        3.pcl::fromPCLPointCloud2 (cloud_blob, *cloud); //* convert from pcl/PCLPointCloud2 to pcl::PointCloud<T>

这行代码使用pcl::fromPCLPointCloud2函数将cloud_blob(类型为PCLPointCloud2)转换为pcl::PointCloud<T>类型,其中T可以是任何特定的点类型(例如pcl::PointXYZ)。转换后的点云数据将被存储在cloud指针所指向的对象中。这里的*cloud是一个智能指针,它指向一个pcl::PointCloud<T>对象。

简单来说,这段代码的目的是从名为“test_pcd.pcd”的文件中加载点云数据,然后将其转换为pcl::PointCloud<T>类型,以供后续处理使用。

  if (pcl::io::loadPCDFile<pcl::PointXYZ> ("test_pcd.pcd", *cloud) == -1) 
  • pcl::io::loadPCDFile<pcl::PointXYZ>: 这是PCL库中的一个函数,用于加载PCD文件。函数中的<pcl::PointXYZ>是指定点云数据类型的模板参数,表示加载的PCD文件中的点云数据是pcl::PointXYZ类型。
  • ("test_pcd.pcd", *cloud): 这是函数的参数。"test_pcd.pcd"是要加载的PCD文件的文件名,*cloud是一个指向点云对象的指针,函数将加载的点云数据存储在该对象中。
  • if (pcl::io::loadPCDFile<pcl::PointXYZ> ("test_pcd.pcd", *cloud) == -1): 这是一个if语句,用于检查PCD文件是否成功加载。如果函数返回值是-1,则表示文件加载失败。
  • const auto& point: *cloud:这段代码是C++的for循环的一部分,用于遍历一个点云数据集,并对其中的每个点进行操作。下面是各部分的解释:

const auto& point: 这是一个常量引用,它表示我们不会在循环体内改变点的值。const意味着这个变量不能被修改,auto意味着编译器会自动推断它的类型,&表示这是一个引用,不是一个新的副本。

*cloud: 这可能是一个指向点云集合的指针。如果是这样,那么*cloud就表示这个集合本身。如果cloud是一个智能指针(例如std::shared_ptr<std::vector<pcl::PointXYZ>>),则*cloud将解引用并返回原始的点云集合。

for (const auto& point: *cloud): 这是一个基于范围的for循环,它遍历点云集合中的每一个点。在每次迭代中,它会创建一个指向集合中当前点的常量引用,并将其命名为point。

因此,这段代码的主要目的是遍历点云集合中的每个点,并在循环体中对每个点进行某种操作(在这个例 子中,操作是打印点的坐标)。

这段代码的完整功能是:如果成功地从名为 "test_pcd.pcd" 的文件中加载了点云数据并存储在 cloud 指向的对象中,则执行if语句后面的代码;如果加载失败,则跳过if语句后面的代码。

参考博文:https://www.cnblogs.com/li-yao7758258/p/6435568.html

以上仅供学习使用,记录pcl学习过程。

  • 22
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值