- 点云数据类型
- 点云格式-pcd
- 向pcd文件写入点云数据
- 从pcd文件读取点云
- kd-tree 的实现
- 基于octree的空间划分及搜索操作
点云数据类型
1.点云定义
根据激光测量原理得到的点云,包括三维坐标(XYZ)和激光反射强度(Intensity)。
根据摄影测量原理得到的点云,包括三维坐标(XYZ)和颜色信息(RGB)。
结合激光测量和摄影测量原理得到点云,包括三维坐标(XYZ)、激光反射强度(Intensity)和颜色信息(RGB)。
在获取物体表面每个采样点的空间坐标后,得到的是一个点的集合,称之为“点云”(Point Cloud)。
点云存储格式有很多:*.pts; *.asc ; *.dat; *.stl ; [1] *.imw;*.xyz;*.las
LAS格式文件已成为LiDAR数据的工业标准格式,LAS文件按每条扫描线排列方式存放数据,包括激光点的三维坐标、多次回波信息、强度信息、扫描角度、分类信息、飞行航带信息、飞行姿态信息、项目信息、GPS信息、数据点颜色信息等。
![bac875788c7760403ddc27068c92928c.png](https://img-blog.csdnimg.cn/img_convert/bac875788c7760403ddc27068c92928c.png)
2. PCL中点云数据类型
点云数据分为有序与无序两种类型:
![1dbff7ca2b059a5a589c34e2b8b6cbe2.png](https://img-blog.csdnimg.cn/img_convert/1dbff7ca2b059a5a589c34e2b8b6cbe2.png)
最基本的数据类型就是PointCloud了。它是一个C++类,包含了如下的数据成员(括号中是这个数据的数据类型):
(1)width(int) :指定了点云数据中的宽度。width有两层含义:
- 对于无序点云而言, 指的是点云的数量。
- 在有序点云中,一行点云的数量。
(2)height(int) :指定了点云数据中的高度。height有两层含义:
- 指定有序点云中,点云行的数量。
- 对于无序点云,将height设为1(它的width即为点云的大小),区分点云是否有序。
(3)points(std::vector) :points是存储类型为PointT的点的向量。举例来说,对于一个包含XYZ数据的点云,points成员就是由pcl::PointXYZ类型的点构成的向量:
(4)is_dense(bool) :
指定点云中的所有数据都是有限的(true),还是其中的一些点不是有限的,它们的XYZ值可能包含inf/NaN 这样的值(false)。
(5)sensor_origin_(Eigen::Vector4f) :
指定传感器的采集位姿(==origin/translation==)这个成员通常是可选的,并且在PCL的主流算法中用不到。
(6)sensor_orientaion_(Eigen::Quaternionf) :
指定传感器的采集位姿(方向)。这个成员通常是可选的,并且在PCL的主流算法中用不到。
为了简化开发,PointCloud类包含许多帮助成员函数。举个例子,如果你想判断一个点云是否有序,不用检查height是否等于1,而可以使用isOrganized()函数来判断:
if (!cloud.isOrganized ())
...
上面所说pcl::PointCloud包含一个域,他作为点的容器,这个域是PointT类型的是pcl::PointCloud类的模板参数,定义了点云的存储类型。
接下来介绍几种常用的点云类型:
(1)pcl::PointCloud<pcl::PointXYZ> //PointXYZ 成员:float x,y,z;表示了xyz3D信息,可以通过points[i].data[0]或points[i].x访问点X的坐标值
(2)pcl::PointCloud<pcl::PointXYZI> //PointXYZI成员:float x, y, z, intensity; 表示XYZ信息加上强度信息的类型。
(3)pcl::PointCloud<pcl::PointXYZRGB> //PointXYZRGB 成员:float x,y,z,rgb; 表示XYZ信息加上RGB信息