点云定义
根据激光测量原理得到的点云,包括三维坐标(XYZ)和激光反射强度(Intensity)。
根据摄影测量原理得到的点云,包括三维坐标(XYZ)和颜色信息(RGB)。
结合激光测量和摄影测量原理得到点云,包括三维坐标(XYZ)、激光反射强度(Intensity)和颜色信息(RGB)。
在获取物体表面每个采样点的空间坐标后,得到的是一个点的集合,称之为“点云”(Point Cloud)。
点云存储格式有很多:*.pts; *.asc ; *.dat; *.stl ; [1] *.imw;*.xyz;*.las
LAS格式文件已成为LiDAR数据的工业标准格式,LAS文件按每条扫描线排列方式存放数据,包括激光点的三维坐标、多次回波信息、强度信息、扫描角度、分类信息、飞行航带信息、飞行姿态信息、项目信息、GPS信息、数据点颜色信息等。
使用point类型
由于pcl模块很多,为了提高编译速度,在组合中使PCL中已经定义的point类型所有的模块都能直接调用,不需要重新编译
通过指针创建点云对象 的两种方式
PCLPonitCloud2 和 PointCloud两种格式的点云对象
实例化模板类PointCloud 每一个点的类型设置为pcl::PointXYZ
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCLPointCLOUD2 cloud;
PCL的example里通常都是这样定义点云:cloud即为创建的点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> );
如果要访问某一个点,点云中点的特征
cloud->points[i].x
可以看到,points是个vector变量,所以points[i]就是单个的点,这里访问了他的x的值,同理可以访问y和z。
如果想往cloud这个变量里面添加一个点的信息,则只需要定一个PointXYZ的变量,然后通过vector的push_back,加入到points这个变量里面
给点云中的一个点设定颜色,即rgb值,不能直接用point赋值
pcl::PointXYZRGB point = cloud->points[1000];
cloud->points[1000].r = 0;
cloud->points[1000].g = 255;
cloud->points[1000].b = 0;
点云的特征
cloud->width;
cloud->height;
cloud->size();
读写点云
#include <iostream>
#include <pcl/io/pcd_io.h>
using namespace std;
int main(int argc, char** argv)
{
#创建一个PointCloud<PointXYZ>boost共享指针并实现实例化
#定义点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
#打开点云文件
if (pcl::io::loadPCDFile<pcl::PointXYZ>("data//bunny.pcd", *cloud) < 0)
{
PCL_ERROR("Could not read file\n");
return (-1);
}
cout << "从点云数据中读取: " << cloud->width * cloud->height <<
" 个, " <<"数据中所包含的有效字段为: " << pcl::getFieldsList(*cloud) << endl;
cerr << "保存为ASCII.形式 " << endl;
pcl::io::savePCDFile("任意.pcd", *cloud, false); // 第三个参数设置为false则保存为ASCII,设置为true则保存为Binary,默认参数为:false。
pcl::io::savePCDFileASCII("ASCII.pcd", *cloud); // 保存速度较慢且保存后的文件较大
cerr << "保存为binary.形式" << endl;
pcl::io::savePCDFileBinary("Binary.pcd", *cloud); // 保存速度较快
cerr << "保存为binary_compressed.形式" << endl;
pcl::io::savePCDFileBinaryCompressed("binary_compressed.pcd", *cloud); // 保存速度较快且保存后的文件较小
return 0;
}
后缀命名为.ply格式文件,常用的点云数据文件。ply文件不仅可以存储点数据,而且可以存储网格数据. 用编辑器打开一个ply文件,观察表头,如果表头element face的值为0,则表示该文件为点云文件,如果element face的值为某一正整数N,则表示该文件为网格文件,且包含N个网格.所以利用pcl读取 ply 文件,不能一味用pcl::PointCloud<PointT>::Ptr cloud (new pcl::PointCloud<PintT>)
来读取。在读取ply文件时候,首先要分清该文件是点云还是网格类文件。如果是点云文件,则按照一般的点云类去读取即可,如果ply文件是网格类,则需要:
#include <pcl/io/ply_io.h>
pcl::PolygonMesh mesh;
pcl::io::loadPLYFile("readName.ply", mesh);
pcl::io::savePLYFile("saveName.ply", mesh);