学习记录:
#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学习过程。