PCL之文件读写

文章目录

前问提要:PCL1.12安装+VS2019环境配置+测试程序:斯坦福兔子
相关源码:PCL环境配置以及测试案例,显示斯坦福兔子

读文件

在上一节,其实已经使用了读取数据的功能,即调用函数loadPCDFile。在PCL中,除了loadPCDFile之外,还可以通过PCDReader读取文件。

其中,loadPCDFile的方法为

void readByLoadPCDFile() {
	PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);
	char strfilepath[256] = "rabbit.pcd";
	io::loadPCDFile(strfilepath, *cloud);
}

 
 

注意,本文所有代码需导入如下头文件和命名空间。

#include<iostream>
#include<pcl/io/pcd_io.h>
#include<pcl/visualization/cloud_viewer.h>
using namespace pcl;                      

 
 

如用PCDReader读取,则其代码为

void readByReader() {
    PCDReader reader;
    PointCloud<pcl::PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);
    reader.read("rabbit.pcd", *cloud);    //读取pcd文件,用指针传递给cloud
    std::cout << "the rabbit has: " << cloud->points.size() 
        << " data points." << std::endl;
}
//输出为the rabbit has: 35947 data points.

 
 

如果查看源代码,可以看到

template<typename PointT> inline int
loadPCDFile (const string &file_name, PointCloud<PointT> &cloud){
   PCDReader p;
   return (p.read (file_name, cloud));
}

 
 

可见loadPCDFile也是调用了PCDReader。

写文件

写入和读取互为反函数,PCL同样提供了savePCDFilewriter.write两种方案。

区别在于,在保存点云文件时,可以选择另存为ASCII格式,或者二进制格式,调用函数如下

io::savePCDFile<PointXYZ>("rabbit_default.pcd", cloud); //默认二进制方式保存
io::savePCDFileASCII<PointXYZ>("rabbit_ASCII.pcd", cloud); //ASCII方式保存
io::savePCDFileBinary<PointXYZ>("rabbit_bin.pcd", cloud); //二进制方式保存

 
 
void readAndWriteRabbit() {
	PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);
	char strfilepath[256] = "rabbit.pcd";
	io::loadPCDFile(strfilepath, *cloud);
  io::savePCDFile<PointXYZ>("rabbit_default.pcd", *cloud);
  io::savePCDFileASCII<PointXYZ>("rabbit_ASCII.pcd", *cloud); //ASCII方式保存
  io::savePCDFileBinary<PointXYZ>("rabbit_bin.pcd", *cloud); //二进制方式保存
}

 
 

然后debug文件夹下会多出这三个文件

sizefile
1,022,375rabbit.pcd
1,089,422rabbit_ASCII.pcd
431,536rabbit_bin.pcd
1,089,422rabbit_default.pcd

可见,默认的保存格式是ASCII格式,而二进制格式的优势则是更加节省空间。

PCD文件

由于ASCII文件是可以阅读的,故可用记事本打开,查看其内容

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z
SIZE 4 4 4
TYPE F F F
COUNT 1 1 1
WIDTH 35947
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 35947
DATA ascii
-1.10698 3.2723939 -0.44724101
-1.80195 3.367094 -0.704211

 
 

PCD由头文件和点云数据构成,从其数据组织可以看出,DATA ascii之前都算作头文件,在此之后,每一行都是三个浮点数,应该是点云数据无疑了。

头文件的可读性也很强,其中VERSION表示版本;POINTS表示点数;DATA表示文件格式。相比之下,其他数据的单词也都认识,但需要略微讲解一下

  • FIELDS x y z:表示每个点都有xyz三个维度信息;如写为FIELDS x y z rgb,则除了xyz之外还有颜色信息,以此类推。
  • SIZE 4 4 4:表示x, y, z在存储时都用了4个字节,可见是intfloat类型。一般来说,1个字节是char2个字节是byte8个字节是double
  • TYPE F F F:表示x, y, z都是浮点型,考虑到占4个字节,所以是float
    • I表示有符号类型,如int8(char), int16(short), int32(int)
    • U表示无符号整型uint8(unsigned char), uint16(unsigned short), uint32(unsigned int)
    • F表示浮点类型float, double
  • COUNT 1 1 1:表示x, y, z每个维度都只包含1个元素。
  • HEIGHT 1:表示这是一个无序集合;当值不为1时,表示数据集的行数(高度)。
  • WIDTH 35947: 表示数据集的列数(宽度)为35947,由于行数为1,从而这是个无序集,所以其点数也为35947。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值