【我的点云哪有这么可爱!】二、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已有点类型介绍和增加自定义的点类型

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值