文章目录
前问提要: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同样提供了savePCDFile
和writer.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文件夹下会多出这三个文件
size | file |
1,022,375 | rabbit.pcd |
1,089,422 | rabbit_ASCII.pcd |
431,536 | rabbit_bin.pcd |
1,089,422 | rabbit_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
个字节,可见是int
或float
类型。一般来说,1
个字节是char
,2
个字节是byte
,8
个字节是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。