点云文件格式--PCD文件说明
VERSION . 7 # PCD文件版本为0.7
FIELDS x y z rgb # 每个点具有的属性 x坐标 y坐标 z坐标 颜色
SIZE 4 4 4 4 # 每个属性字段对应的大小-字节数
TYPE F F F F # 每个属性字段对应的格式-F-FLOAT浮点数
COUNT 1 1 1 1 # 每个属性字段包含的元素个数
WIDTH 213
HEIGHT 1 # 无序点云的高度设置为1,有序则按照行列即可
VIEWPOINT 0 0 0 1 0 0 0 # 点云的获取视点,平移量+四元数
POINTS 213 # 点云数量,即宽*高
DATA ascii # 数据文件类型,ascii和二进制
0.8741 0.5214 0.2365 4.2153e+06 # 具体点描述
0.8741 0.5214 0.2365 4.2153e+06
0.8741 0.5214 0.2365 4.2153e+06
0.8741 0.5214 0.2365 4.2153e+06
0.8741 0.5214 0.2365 4.2153e+06
……
PCD点云文件读取的头文件及关键语句:
//头文件部分
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
//新建一个点云指针并实例化
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
//打开并读取PCD文件
if(pcl::io::loadPCDFile<pcl::PointXYZ>("***.pcd",*cloud) == -1)
{
PCL_ERROR("Couldn't read file ***.pcd \n");
return(-1);
}
PCD点云文件写入的头文件及关键语句:
//头文件
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
//创建点云
pcl::PointCloud<pcl::PointXYZ> cloud;
cloud.width = 3;
cloud.height = 1;
cloud.is_dense = false;
cloud.points.resize(cloud.width * cloud.height);
for(size_t i = 0; i < cloud.points.size(); i++)
{
cloud.points[i].x = 1.0202;
cloud.points[i].y = 2.0202;
cloud.points[i].z = 3.0202;
}
//写入点云
pcl::io::savePCDFileASCII("***.pcd",cloud);
连接点云的关键语句:
//简单合并两个点云
pcl::PointCloud<pcl::PointXYZ> cloud_1;
pcl::PointCloud<pcl::PointXYZ> cloud_2;
pcl::PointCloud<pcl::PointXYZ> cloud_1_2;
cloud_1_2 = cloud_1 + cloud_2;
//合并一个点云的不同属性文件
pcl::PointCloud<pcl::PointXYZ> cloud_xyz;
pcl::PointCloud<pcl::Normal> cloud_n;
pcl::PointCloud<pcl::PointNormal> cloud_xyz_n;
pcl::concatenateFields(cloud_xyz,cloud_n,cloud_xyz_n);
点云数据格式转换:LAS--PCD,主要依赖LibLAS
//头文件
#include <iostream>
#include <cstdlib>
#include <liblas/liblas.hpp>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
//打开LAS文件
std::ifstream ifs("***.las",std::ios::in | std::ios::binary);
//读取LAS文件
liblas::ReaderFactory f;
liblas::Reader reader = f.CreateWithStream(ifs);
//获取LAS文件点数
int las_pts = reader.GetHeader().GetPointRecordsCount();
//逐点读取LAS文件并存入cloud
while(reader.ReadNextPoint())
{
//读取xyz
cloud.points[i].x = (reader.GetPoint().GetX());
cloud.points[i].y = (reader.GetPoint().GetY());
cloud.points[i].z = (reader.GetPoint().GetZ());
//读取rgb
r = (reader.GetPoint().GetColor().GetRed());
g = (reader.GetPoint().GetColor().GetGreen());
b = (reader.GetPoint().GetColor().GetBlue());
r_n = ceil(((float)r / 65536) * (float)256);
g_n = ceil(((float)g / 65536) * (float)256);
b_n = ceil(((float)b / 65536) * (float)256);
rgb = ((int)r_n) << 16 | ((int)g_n) << 8 | ((int)b_n);
cloud.points[i].rgb = *reinterpret_cast<float*>(&rgb);
i++;
}
PLY文件读取的关键语句:
//读取PLY文件
pcl::PLYReader reader;
if (reader.read(filename,cloud) < 0)
return(false);
//写入PLY文件
pcl::PLYWriter writer;
writer.write("***.ply",cloud);