学习点云库,这句话不是很理解

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
希望用过pcl,真正清楚的人,帮忙详细的解释一下,谢谢了

pcl 是一个命名空间,跟std类似,PointCloud是类模板,<pcl::PointXYZ>是模板类实例化的类型,PointCloud<pcl::PointXYZ>就是一个实例化了的模板类,ptr是只能指针,相当于之前普通指针声明的*,cloud是指针变量,就是一个指向PointCloud<pcl::PointXYZ>类对象的指针,new pcl::PointCloud<pcl::PointXYZ>就是给了一个地址初始化指针
温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-09-07
首先,在PCL(Point Cloud Learning)中国协助发行的书[1]提供光盘的第4章例1文件夹中,打开名为pcd_read.cpp的代码文件。同目录下可找到测试点云文件test_pcd.pcd。
现在,我们解析上面打开的代码。
#include <iostream> //标准C++库中的输入输出类相关头文件。
#include <pcl/io/pcd_io.h> //pcd 读写类相关的头文件。
#include <pcl/point_types.h> //PCL中支持的点类型头文件。

与本程序相关的头文件声明。
pcl::PointCloud<pcl::PointXYZ>::Ptrcloud(newpcl::PointCloud<pcl::PointXYZ>);

创建一个PointCloud<PointXYZ> boost共享指针并进行实例化。
if(pcl::io::loadPCDFile<pcl::PointXYZ>("test_pcd.pcd",*cloud)==-1)//打开点云文件
{
PCL_ERROR("Couldn't read file test_pcd.pcd\n");
return(-1);
}

从磁盘上加载PointCloud数据(假设test_pcd.pcd文件已经被创建了)到二进制存储块中。或者,你可以读取PointCloud2存储块(仅仅在PCL 1.x中可用)。由于点云的动态性质,我们更愿意以二进制块来读取,然后转换成我们要使用的表示方式。
sensor_msgs::PointCloud2cloud_blob;//PointCloud2适合版本低的点云文件
pcl::io::loadPCDFile("test_pcd.pcd",cloud_blob);
pcl::fromROSMsg(cloud_blob,*cloud);
//* sensor_msgs/PointCloud2 转换为 pcl::PointCloud<T>

把二进制块读取并转换到模板化的PointCloud格式里,这里用pcl::PointXYZ作为点类型。
for(size_ti=0;i<cloud->points.size();++i)
std::cout<<" "<<cloud->points[i].x
<<" "<<cloud->points[i].y
<<" "<<cloud->points[i].z<<std::endl;

最后在标准输出上打印出从文件中加载的数据。
编译并运行该程序
利用光盘提供的CMakeLists.txt文件,在cmake中建立工程文件,并生成相应的可执行文件,生成可执行程序之后,就可以运行了。在cmd中键入以下命令:
...>pcd_read.exe

运行之后,可看见如图1所示的输出结果,在本例中提供的是点云文件版本0.7,所以在代码中没有涉及到PointCloud2,如果用户需要读取版本较低的pcd文件,需要替换点云读取代码为上面描述的PointCloud2读取方式。

图1 点云读取例子运行结果
注意,如果test_pcd.pcd文件不存在(没有创建或者被删除了),将会提示如下错误信息:追问

复制粘贴的就不要浪费各自的时间

第2个回答  2016-10-24
简单说就是创建了一个名叫cloud的储存XYZ类型点云数据的指针
相似回答