PCL初探

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一些概念

PCD文件格式:

VERSION .7								# 版本号
FIELDS x y z rgb				#  指定一个点可以有的每一个维度和字段的名字
SIZE 4 4 4 4								# 用字节数指定每一个维度的大小。例如:
TYPE F FFF									# 用一个字符指定每一个维度的类型 int uint folat
COUNT 1 1 1 1						# 指定每一个维度包含的元素数目
WIDTH 640    						   # 像图像一样的有序结构,有640行和480列,
HEIGHT 480    					  # 这样该数据集中共有640*480=307200个点
VIEWPOINT 0 0 0 1 0 0 0			# 指定数据集中点云的获取视点 视点信息被指定为平移(txtytz)+四元数(qwqxqyqz)
POINTS 307200						# 指定点云中点的总数。从0.7版本开始,该字段就有点多余了
DATA ascii										# 指定存储点云数据的数据类型。支持两种数据类型:ascii和二进制
0.93773 0.33763 0 4.2108e+06
0.90805 0.35641 0 4.2108e+06

PCD 不是第 一个支持 3D点云数据的文件类型,尤其是计算机图形学和计算几何学领域,已经创建了很多格式来描述任意多边形和激光扫描仪获取的点云。常见的有下面几种格式:

PLY 是一种多边形文件格式 , 由 Stanford 大学的 Turk 等人设计开发;
STL 是 3D Systems 公司创建的模型文件格式,主要应用于 CAD 、 CAM领域 ;
OBJ 是从几何学上定义的文件格式,首先由 Wavefront Technologies 开发;

以上所有格式都有其优缺点,因为他们是在不同时期为了满足不同的需求所创建的,那时很多当今流行的传感器和算法都还没有发明。

pcd文件格式详解

PCD版本

在点云库(PCL)1.0版本发布之前,PCD文件格式有不同的修订号。这些修订号用PCD_Vx来编号(例如,PCD_V5、PCD_V6、PCD_V7等等),代表PCD文件的0.x版本号。然而PCL中PCD文件格式的正式发布是0.7版本(PCD_V7)。

文件头格式

每一个PCD文件包含一个文件头,它确定和声明文件中存储的点云数据的某种特性。PCD文件头必须用ASCII码来编码。PCD文件中指定的每一个文件头字段以及ascii点数据都用一个新行(\n)分开了,从0.7版本开始,PCD文件头包含下面的字段:

● VERSION –指定PCD文件版本

● FIELDS –指定一个点可以有的每一个维度和字段的名字。例如:
FIELDS x y z # XYZ data
FIELDS x y z rgb # XYZ + colors
FIELDS x y z normal_xnormal_y normal_z # XYZ + surface normals
FIELDS j1 j2 j3 # moment invariants

·SIZE –用字节数指定每一个维度的大小。例如:
unsigned char/char has 1 byte
unsigned short/short has 2 bytes
unsignedint/int/float has 4 bytes
double has 8 bytes

·TYPE –用一个字符指定每一个维度的类型。现在被接受的类型有:
I –表示有符号类型int8(char)、int16(short)和int32(int);
U – 表示无符号类型uint8(unsigned char)、uint16(unsigned short)和uint32(unsigned int);
F –表示浮点类型。

·COUNT –指定每一个维度包含的元素数目。例如,x这个数据通常有一个元素,但是像VFH这样的特征描述子就有308个。实际上这是在给每一点引入n维直方图描述符的方法,把它们当做单个的连续存储块。默认情况下,如果没有COUNT,所有维度的数目被设置成1。

·WIDTH –用点的数量表示点云数据集的宽度。根据是有序点云还是无序点云,WIDTH有两层解释:
1)它能确定无序数据集的点云中点的个数(和下面的POINTS一样);
2)它能确定有序点云数据集的宽度(一行中点的数目)。
注意:有序点云数据集,意味着点云是类似于图像(或者矩阵)的结构,数据分为行和列。这种点云的实例包括立体摄像机和时间飞行摄像机生成的数据。有序数据集的优势在于,预先了解相邻点(和像素点类似)的关系,邻域操作更加高效,这样就加速了计算并降低了PCL中某些算法的成本。
例如:
WIDTH 640 # 每行有640个点

·HEIGHT –用点的数目表示点云数据集的高度。类似于WIDTH ,HEIGHT也有两层解释:
1)它表示有序点云数据集的高度(行的总数);
2)对于无序数据集它被设置成1(被用来检查一个数据集是有序还是无序)。
有序点云例子:
WIDTH 640 # 像图像一样的有序结构,有640行和480列,
HEIGHT 480 # 这样该数据集中共有640*480=307200个点
无序点云例子:
WIDTH 307200
HEIGHT 1 # 有307200个点的无序点云数据集

·VIEWPOINT–指定数据集中点云的获取视点。VIEWPOINT有可能在不同坐标系之间转换的时候应用,在辅助获取其他特征时也比较有用,例如曲面法线,在判断方向一致性时,需要知道视点的方位,
视点信息被指定为平移(txtytz)+四元数(qwqxqyqz)。默认值是:
VIEWPOINT 0 0 0 1 0 0 0

·POINTS–指定点云中点的总数。从0.7版本开始,该字段就有点多余了,因此有可能在将来的版本中将它移除。
例子:
POINTS 307200 #点云中点的总数为307200

·DATA –指定存储点云数据的数据类型。从0.7版本开始,支持两种数据类型:ascii和二进制。查看下一节可以获得更多细节。
注意:文件头最后一行(DATA)的下一个字节就被看成是点云的数据部分了,它会被解释为点云数据。

警告:PCD文件的文件头部分必须以上面的顺序精确指定,也就是如下顺序:
VERSION、FIELDS、SIZE、TYPE、COUNT、WIDTH、HEIGHT、VIEWPOINT、POINTS、DATA
之间用换行隔开。

(搬运过来的,方便自己后期查找)摘自https://www.yuque.com/huangzhongqing/pcl/hl1582

点云的各种数据类型转换

太有用了!!!

格式转换(这个大佬的博客里有)

我要用的是STL转PCD格式,需要来回转。

怎样将点云类型pcl::PointXYZI转换成pcl::PointXYZ?
  pcl::PointCloud<pcl::PointXYZI>::Ptr keypoints (new pcl::PointCloud<pcl::PointXYZI>);
  keypoints_Harris( cloud_xyz, keypoints);

  pcl::PointCloud<pcl::PointXYZ>::Ptr keypoints_ptr(new pcl::PointCloud<pcl::PointXYZ>); 
  copyPointCloud (*keypoints , *keypoints_ptr);


common模块中的头文件

1. angles.h 定义了标准的C接口的角度计算函数
2. centriod.h 定义了中心点的估算以及协方差矩阵的计算
3. commo.h 标准的C以及C++类,是其他common 函数的父类
4. distance.h 定义标准的C接口用于计算距离
5. file_io.h 定义了一些文件帮助写或者读方面的功能。
6. random.h 定义一些随机点云生成的函数
7. geometry.h 定义一些基本的几何功能的函数
8. intersection.h 定义线与线相交的函数
9. norm.h 定义了标准的C方法计算矩阵的正则化
10. time.h 定义了时间计算的函数
11. Point_types.h 定义了所有PCL实现的点云的数据结构的类型

做个了解即可,有机会读下源码

学习教程链接:(存起来)
https://zhuanlan.zhihu.com/p/268524083
https://www.cnblogs.com/li-yao7758258/p/12011234.html
https://www.yuque.com/huangzhongqing/pcl/habl9h
https://robot.czxy.com/docs/pcl/chapter01/decomposition/#octree

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值