SLAM学习交流可加群:248085206
点云数据是指在一个三维坐标系中的一组向量的集合。这些向量通常以X,Y,Z三维坐标的形式表示,一般主要代表一个物体的外表面几何形状,除此之外点云数据还可以附带RGB信息,即每个坐标点的颜色信息,或者是其他的信息。
在这里推荐大家都将都将点云数据保存为 *.pcd文件,因为有pcl这个开源库专门处理pcd格式的文件,它实现了点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。
下面是通过pycharm编辑器解析的.pcd文件:
(1).VERSION 0.7
指定pcd文件的版本。
(2).FIELDS
指定每个点可以具有的维度,以及每个维度所代表的含义。
例如:FIELDS x y z r g b表示该点的位置信息(x,y,z),颜色信息(r,g,b)。
(3).SIZE
以字节为单位指定每个数据所占用的内存。
(4).TYPE
指定每个数据的数据类型。其中无效的点的通常存储为NAN类型。
I:可表示int8,int16,int32。
U:可表示uint8,unit16,uint32。
F:表示float(上图所用的为浮点类型)。
(5).COUNT
指定每个维度有多少元素。
例如xyz数据通常只有一个元素。
(6).WIDTH
指定数据点的宽度,它包含两个含义:
1.可指定点云总个数(与POINTS相同),用于无组织的数据。
2.可指定有组织点云数据的宽度(连续点的总数)。
(7).HEIGTH
指定数据点的高度,它包含两个含义:
1.可指定有组织的点云数据的高度(总行数)。
2.对未组织的数据,它被设置为1。
(8).POINTS
指定点云总个数。
(9).VIEWPOINT
采集数据时的视点(由平移tx,ty,tz和四元数qw,qx,qy,qz组成)。
(10).DATA
点云数据存储的数据类型(支持ascii和binary)。如果以ASCII形式,每一点占据一个新行。
所有的pcd文件前十行必须是以上的格式,并且不能改变顺序。
write_pcd.cpp :
#include //标准C++库中的输入输出的头文件
#include //PCD读写类相关的头文件
#include //PCL中支持的点类型的头文件
int
main (int argc, char** argv)
{
//实例化的模板类PointCloud 每一个点的类型都设置为pcl::PointXYZ
/*************************************************
点PointXYZ类型对应的数据结构
Structure PointXYZ{
float x;
float y;
float z;
};
**************************************************/
pcl::PointCloud cloud; //创建一个存储点云的容器,容器中每个点的类型是pcl::PointXYZ。
// 并设置点云容器适当的参数(width height is_dense)
cloud.width = 5;
cloud.height = 1;
cloud.is_dense = false; //不是稠密型的
cloud.points.resize (cloud.width * cloud.height); //点云总数大小
//用随机数的值填充PointCloud点云对象
for (size_t i = 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对象数据存储在 test_pcd.pcd文件中,并以ascii码的形式。
pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud);
//打印输出存储的点云数据
std::cerr << "Saved " << cloud.points.size () << " data points to test_pcd.pcd." << std::endl;
for (size_t i = 0; i < cloud.points.size (); ++i)
std::cerr << " " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;
return (0);
}
write.cpp:
#include //标准C++库中的输入输出的头文件
#include //PCD读写类相关的头文件
#include //PCL中支持的点类型的头文件
int
main (int argc, char** argv)
{
//创建一个PointCloud boost共享指针并进行实例化
pcl::PointCloud::Ptr cloud (new pcl::PointCloud);
//打开点云文件
if (pcl::io::loadPCDFile ("test_pcd.pcd", *cloud) == -1)
{
PCL_ERROR ("Couldn't read file test_pcd.pcd \n");
return (-1);
}
//默认就是而二进制块读取转换为模块化的PointCLoud格式里pcl::PointXYZ作为点类型 然后打印出来
std::cout << "Loaded "
<< cloud->width * cloud->height
<< " data points from test_pcd.pcd with the following fields: "
<< std::endl;
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;
return (0);
}