输入输出IO(2)

点云文件格式--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);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值