【我的点云哪有这么可爱!】系列目录
第零章 从学习思路开始
第一章 点云概述基础知识
第二章 PCL!yyds!
【我的点云哪有这么可爱!】二、PCL!yyds!
前言
在上一章节中介绍了点云的一些基本概念,包括点云的数据获取、点云的应用、点云算法基本介绍、点云常用软件与开源库。这一章节我们将介绍永远滴神PCL点云库。
一、PCL是什么?
PCL全称为Point Cloud Library。是一个3D点云处理的开源库。
如果说OpenCV是2D信息获取与处理的结晶,那么PCL就在3D信息获取与处理上有同等的地位。
2010年随着消费级RGB-D设备大量上市,微软的Kinect为先导,大量公司开始从事相关的硬件生产,形成了新一代的机器视觉生态链,PCL应运而生。
PCL起初由ROS(Robot Operating System)下来自斯坦福大学的Radu博士等人维护和开发的开源项目,主要应用于机器人研究应用领域,随着算法模块的积累,与2011年独立出来,与全球3D信息获取、处理的同行一起组件了强大的开发维护团队,以多所知名大学、研究所和相关软硬件公司为主。
PCL是在吸收了前人相关研究的基础上建立起来的跨平台开源点云库,实现了大量通用算法和数据结构,涉及点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等基础模块,以及人体骨骼识别提取、动作跟踪识别等应用。
二、设计理念与架构
如图PCL架构图所示,对于3D点云处理来说,PCL完全是一个的模块化的现代C++模板库。其基于以下第三方库:
Boost、Eigen、FLANN、VTK、CUDA、OpenNI、Qhull,实现点云相关的获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。
PCL利用OpenMP、GPU、CUDA等先进高性能计算技术,通过并行化提高程序实时性。PCL中的底层数据结构在很大程度上利用了SSE优化,在现代cpu上考虑了效率和性能。大多数数学运算都是基于线性代数的Eigen开源库实现,K近邻搜索操作的构架是基于FLANN (Fast Library for Approximate Nearest Neighbors)所实现的,速度也是技术中最快的。PCL中的所有模块和算法都是通过Boost共享指针来传送数据的,因而避免了多次复制系统中已存在的数据的需要。
从算法角度来看,PCL指结合了多种3D处理算法,对点云数据进行操作,包括:滤波、特征估计、曲面重建、模型拟合、分割、配准,每一组算法都通过基类定义,基类试图集成整个管线的所有公用功能,实现实际算法的紧凑干净。
PCL处理这种管道的基本接口:
- 创建处理对象(例如过滤器、特征估计、分割)
- 使用setInputCloud将输入点云数据集传递给处理模块
- 调用compute(或者filter、segment等)获得输出
为了简化开发,PCL被分成一系列可以单独编译的小代码库:
三、如何配置PCL及使用
PCL最为一个功能强大的开源库,可在Windows、Linux、Mac OS X等操作系统中运行。
配置及使用样例可以参考
VS2019下PCL1.11.1的安装配置
Ubuntu18.04下的PCL安装(摸爬滚打)
四、PCL的点类型
PCL中定义了大量的point类型,大多数需要用到的类型已经被包含在内了。
点云的数据结构主要有如下格式:PointXYZ、PointXYZI、PointXYZRGBA、PointXYZRGB、PointXY、InterestPoint、Normal、PointNormal、PointXYZRGBNormal、PointXYZINormal、PointXYZLNormal、PointXYZL、PointXYZRGBL、PointXYZHSV、PointWithRange、PointWithViewpoint、MomentInvariants、PrincipalRadiiRSD、Boundary、PrincipalCurvatures、PFHSignature125、FPFHSignature33、VFHSignature308、Narf36、BorderDescription、IntensityGradient、Histogram、PointWithScale、PointSurfel。
参见头文件:pcl/point_types.h
为什么用PointT类型?
PCL的PointT可以追溯到它在ROS中作为开源库被开发的时候,大家一致认为,点云是复杂的n维结构,它需要能表示不同类型的信息,然而用户应该知道并理解需要传送什么样的信息,为了使代码更易于调试,考虑优化等等。
对带SSE功能的处理器,最高效的方法是存储3维坐标为浮点型,紧跟着一个浮点型数据作为填补位数以满足存储对齐要求:
struct PointXYZ
{
float x;
float y;
float z;
float padding;
};
由于PCL中所有的算法都是模板化的,除了更改的自定义结构之外,不需要做其他的更改,增加了代码的重用性和可读性。
《PCL点云数据格式,可用的PointT类型》
《PCL中PointT类型详解》
这两篇文章中对目前PCL自带的点云类型进行了一个介绍可以参考
例子:自己定义PCL的点云类型:
#include<pcl/point_types.h>
#include<pcl/point_cloud.h>
#include<pcl/io/pcd_io/h>
struct MyFreeType//定义点类型结构,为了增加新的point类型,首先需要定义
{
PCL_ADD_POINT4D; //该类型由4个元素组成
float test;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW //确保new操作符对齐操作
}EIGEN_ALIGN16; //强制SSE对齐
POINT_CLOUD_REGISTER_POINT_STRUCT(MyFreeType, //注册点类型宏
(float,x,x)
(float,y,y)
(float,y,y)
(float,test,test)
)
int
main(int argc,char * * argv)
{
pcl::PointCloud<MyFreeType>cloud;
cloud.points.resize(2);
cloud.width = 2;
cloud.height = 1;
cloud.points[0].test = 1;
cloud.points[1].test = 2;
cloud.points[0].x = cloud.points[0].y = cloud.points[0].z = 0;
cloud.points[1].x = cloud.points[1].y = cloud.points[1].z = 3;
pcl::io::savePCDFile("test.pcd",cloud);
}
参考文章:
1、PCL从入门到精通_1_概述
2、PCL吧贴
3、R. B. Rusu and S. Cousins, “3D is here: Point Cloud Library (PCL),” 2011 IEEE International Conference on Robotics and Automation, 2011, pp. 1-4, doi: 10.1109/ICRA.2011.5980567.
4、PCL已有点类型介绍和增加自定义的点类型
5、PCL点云类型详解
6、3.3PCL已有点类型介绍和增加自定义的点类型