向PCD文件写入点云数据
博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=83
本小节我们学习如何向PCD文件写入点云数据。
代码
首先,在PCL(Point Cloud Learning)中国协助发行的书[1]提供光盘的第4章例2文件夹中,打开名为pcd_write.cpp的代码文件。
解释说明
现在,我们解析上面代码:
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
pcl/io/pcd_io.h头文件中包含了PCD输入输出操作的声明,pcl/point_types.h头文件则包含一些PointT类型结构体的声明(本例中是pcl::PointXYZ)。
pcl::PointCloud<pcl::PointXYZ>cloud;
描述我们将要实例化的模板类PointCloud,每一个点的类型都被设置成pcl::PointXYZ,作为模板类实例化的参数,其他类型请参考点类型介绍一节,pcl::PointXYZ具体定义如下下面:
// 点PointXYZ类型对应的数据结构 Struct PointXYZ { floatx; floaty; floatz; };
下面这几行:
// 创建点云 cloud.width=5; cloud.height=1; cloud.is_dense=false; cloud.points.resize(cloud.width*cloud.height); for(size_ti=0;i<cloud.points.size();++i) { cloud.points[i].x=1024*rand()/(RAND_MAX+1.0f); cloud.points[i].y=1024*rand()/(RAND_MAX+1.0f); cloud.points[i].z=1024*rand()/(RAND_MAX+1.0f); }
用随机点的值填充PointCloud点云对象,并设置适当的参数(width、height、is_dense)。然后:
pcl::io::savePCDFileASCII("test_pcd.pcd",cloud);
把PointCloud对象数据存储在test_pcd.pcd文件中。最后:
std::cerr<<"Saved "<<cloud.points.size()<<" data points to test_pcd.pcd."<<std::endl; for(size_ti=0;i<cloud.points.size();++i) std::cerr<<" "<<cloud.points[i].x<<" "<<cloud.points[i].y<<" "<<cloud.points[i].z<<std::endl;
上面几行代码用来打印输出存储的点云数据。
编译并运行该程序
利用光盘提供的CMakeLists.txt文件,在cmake中建立工程文件,并生成相应的可执行文件,生成可执行文件之后,就可以运行了,在cmd中使用以下命令:
...>pcd_write.exe
将在cmd界面看到类似下面的东西:
图1 点云写入例子运行结果
Linux下用户可以方便的用下面的命令检查test_pcd.pcd文件的内容,在window上的用户直接用一般的word等就可以对pcd文件进行打开(只限于0.7版本的,低版本的打开显示不完整)。
$ cattest_pcd.pcd # .PCD v.5 - Point Cloud Data file format FIELDS x y z SIZE 4 4 4 TYPE F FF WIDTH 5 HEIGHT 1 POINTS 5 DATA ascii 0.35222 -0.15188 -0.1064 -0.39741 -0.47311 0.2926 -0.7319 0.6671 0.4413 -0.73477 0.85458 -0.036173 -0.4607 -0.27747 -0.91676
敬请关注PCL(Point Cloud Learning)中国更多的点云库PCL(Point Cloud Library)相关官方教程。
参考文献:
1.朱德海、郭浩、苏伟.点云库PCL学习教程(ISBN 978-7-5124-0954-5)北京航空航天出版社 2012-10