先贴一段代码,从别处抄来的
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include<pcl/visualization/cloud_viewer.h>
int
main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>(argv[1], *cloud) == -1)
{
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;
#if 0
for (size_t i = 0; i < cloud->points.size(); ++i)
std::cout << " " << cloud->points[i].x
<< " " << cloud->points[i].y
<< " " << cloud->points[i].z << std::endl;
#endif pcl::visualization::CloudViewer viewer("test");
viewer.showCloud(cloud);
while (!viewer.wasStopped()){}
return (0);
}
这段代码是读取了一个pcd文件
pcl::io::loadPCDFile<pcl::PointXYZ>(argv[1],*cloud);
将其存储到cloud之中,再通过
pcl::visualization::CloudViewer viewer
的
showCloud(cloud)
函数,将其显示到屏幕之中。
我这里读取的是pcl的一个logo
看懂这段代码需要一定基础的C++知识
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl是一个命名空间,PointCloud是一个模板类,Ptr是一个boost库中的共享指针类型(shared_ptr,是一种智能指针).
所以这段代码就是定义了一个智能指针cloud,这个指针指向PointCloud类型,这个PointCloud类型以pcl::PointXYZ为参数。
PointXYZ是一种结构体,这中结构体类型应该是包含了点的三维坐标数据(但是我没找到这个结构体定义中的三维坐标数据变量在哪里。。)
cloud(new pcl::PointCloud<pcl::PointXYZ>)是智能指针的初始化(还不是很熟悉,不知道对不对,姑且这么叫吧),反正就是让cloud指向了一个新申请的PointCloud类型的对象。
pcl::io::loadPCDFile(),明显,这是读取pcd文件的函数,将pcd文件中的数据读取到cloud所指的对象中。
后面的std::cout这个不用说了,标准输出,即输出到屏幕,
cloud->width*cloud->height,这里是输出点云的个数,这里有点小知识:
点云数据集分为有序点云数据集和无序点云数据集,有序的点云数据集可以想成矩阵形式的分行分列,width就是这个数据集的宽度,height就是这个数据集的高度,是二维形式的,width*height就是点的个数。而无序点云数据集就是一维形式的,width就是点的个数,和pcd文件格式中的POINTS一样,height就为1,这样width*height也是点的个数。
所以这段代码不用说了,反正就是输出点的个数就行了。
后面有个预编译指令#if....#endif,貌似没有什么卵用。。。反正都不会执行,我不知道为什么,原代码作者是这么写的代码。。。
后面的代码就很明显了
pcl::visualization::CloudViewer view("test");
创建了一个用于显示点云的CloudViewer类型的对象,其实就是上图中的黑窗口,用来3维显示点云数据的,
viewer.showCloud(cloud); // 这里就是显示的代码
后面有个循环,现在还不太清楚这个循环的意义,wasStopped()是貌似用于注销窗口?