前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >点云及PCL编程基础

点云及PCL编程基础

作者头像
点云PCL博主
发布2019-07-30 17:01:30
3.5K0
发布2019-07-30 17:01:30
举报
文章被收录于专栏:点云PCL

上周点云公众号开启了学习模式,由博主分配任务,半个月甚至一个月参与学习小伙伴的反馈给群主,并在微信交流群中进行学术交流,加强大家的阅读文献能力,并提高公众号的分享效果。在此期待更多的同学能参与进来!

点云基础

点云定义

定义:通过测量仪器(激光,三维相机)得到的产品外观表面的点数据集合也称之为点云。

通常使用三维坐标测量机所得到的点数量比较少,点与点的间距也比较大,叫稀疏点云;而使用三维激光扫描仪或照相式扫描仪得到的点云,点数量比较大并且比较密集,叫密集点云或者叫稠密点云。

对点云理解

点云是在和目标物体表面特性的海量点集合。根据激光测量原理得到的点云,包括三维坐标(XYZ)和激光反射强度(Intensity)。

当一束激光照射到物体表面时,所反射的激光会携带方位、距离等信息。若将激光束按照某种轨迹进行扫描,便会边扫描边记录到反射的激光点信息,由于扫描极为精细,则能够得到大量的激光点,因而就可形成激光点云。

根据摄影测量原理得到的点云,包括三维坐标(XYZ)和颜色信息(RGB)。结合激光测量和摄影测量原理得到点云,包括三维坐标(XYZ)、激光反射强度(Intensity)和颜色信息(RGB)。

在获取物体表面每个采样点的空间坐标后,得到的是一个点的集合,称之为“点云”(Point Cloud)。点云的格式:; *.pts; *.asc ; *.dat; *.stl ; *.imw;*.xyz,PCD;

在PCL点云库中经常使用的点云的格式有pcd,ply,xyz, 这里先介绍一些基本内容,后面的章节将会以程序实例展示以及解释api代码功能。

点云的特性

点云是某个坐标系下的点的数据集。点包含了丰富的信息,包括三维坐标X,Y,Z、颜色、分类值、强度值、时间等等,

(1)非结构化数据(无网格):点云是分布在空间中的XYZ点。

(3)点云数量上的变化:在图像中,像素的数量是一个给定的常数,取决于相机。 然而,点云的数量可能会有很大的变化,这取决于各种传感器。

(3)不变性排列:点云本质上是一长串点(nx3矩阵,其中n是点数)。 在几何上,点的顺序不影响它在底层矩阵结构中的表示方式,例如, 相同的点云可以由两个完全不同的矩阵表示。 如下图所示:

PCL基础

PCL库简介

PCL起初是ROS(Robot Operating System)下由来自于慕尼黑大学(TUM - Technische Universität München)和斯坦福大学(Stanford University)Radu博士等人维护和开发的开源项目,主要应用于机器人研究应用领域,随着各个算法模块的积累,于2011年独立出来,正式与全球3D信息获取、处理的同行一起,组建了强大的开发维护团队,以多所知名大学、研究所和相关硬件、软件公司为主。截止目前,发展非常迅速,不断有新的研究机构等加入,在Willow Garage, NVidia, Google (GSOC 2011), Toyota, Trimble, Urban Robotics, Honda Research Institute等多个全球知名公司的资金支持下,不断提出新的开发计划,代码更新非常活跃,至今在不到一年的时间内从1.0版本已经发布到1.9.0版本。

PCL库简介

我们理解了点云的概念,再看看PCL点云库,这个是我们依赖的编程的基础库,对于点云的处理,有太多的库了,这里我们主要以PCL库为主,

PCL(Point Cloud Library)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。支持多种操作系统平台,可在Windows、Linux、Android、Mac OS X、部分嵌入式实时系统上运行。如果说OpenCV是2D信息获取与处理的结晶,那么PCL就在3D信息获取与处理上具有同等地位,PCL是BSD授权方式,可以免费进行商业和学术应用。

对于3D点云处理来说,PCL完全是一个的模块化的现代C++模板库。其基于以下第三方库:Boost、Eigen、FLANN、VTK、CUDA、OpenNI、Qhull,实现点云相关的获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。PCL利用OpenMP、GPU、CUDA等先进高性能计算技术,通过并行化提高程序实时性。K近邻搜索操作的构架是基于FLANN (Fast Library for Approximate Nearest Neighbors)所实现的,速度也是目前技术中最快的。PCL中的所有模块和算法都是通过Boost共享指针来传送数据的,因而避免了多次复制系统中已存在的数据的需要,从0.6版本开始,PCL就已经被移入到Windows,MacOS和Linux系统,并且在Android系统也已经开始投入使用,这使得PCL的应用容易移植与多方发布。

PCL能解决什么问题呢?

机器人领域移动机器人对其工作环境的有效感知、辨识与认知,是其进行自主行为优化并可靠完成所承担任务的前提和基础。如何实现场景中物体的有效分类与识别是

移动机器人场景认知的核心问题,目前基于视觉图像处理技术来进行场景的认知是该领域的重要方法。但移动机器人在线获取的视觉图像质量受光线变化影响较大,特别是在光线较暗的场景更难以应用,随着RGBD获取设备的大量推广,在机器人领域势必掀起一股深度信息结合2D信息的应用研究热潮,深度信息的引入能够使机器人更好地对环境进行认知、辨识,与图像信息在机器人领域的应用一样,需要强大智能软件算法支撑,PCL就为此而生,最重要的是PCL本身就是为机器人而发起的开源项目,PCL中不仅提供了对现有的RGBD信息的获取设备的支持,还提供了高效的分割、特征提取、识别、追踪等最新的算法,最重要的是它可以移植到android、ubuntu等主流Linux平台上

PCL库模块介绍

从算法的角度,PCL是指纳入了多种操作点云数据的三维处理算法,其中包括:过滤,特征估计,表面重建,模型拟合和分割,定位搜索等。每一套算法都是通过基类进行划分的,试图把贯穿整个流水线处理技术的所有常见功能整合在一起,从而保持了整个算法实现过程中的紧凑和结构清晰,提高代码的重用性、简洁可读。

PCL包括多个子模块库。最重要的PCL模块库有如下:过滤器Filters、特征Features、关键点Keypoints、注册Registration、Kd树Kd-tree、八叉树Octree、切分Segmentation、Sample Consensus、Surface、Range Image、文件读写I/O、Visualization、通用库Common、Search在PCL中一个处理管道的基本接口程序是:

(1)创建处理对象:(例如过滤、特征估计、分割等);

(2)使用setInputCloud通过输入点云数据,处理模块;

(3)设置算法相关参数;

(4)调用计算(或过滤、分割等)得到输出。

为了进一步简化和开发,PCL被分成一系列较小的代码库,使其模块化,以便能够单独编译使用提高可配置性,特别适用于嵌入式处理中。

之后公众号会发布对每一个模块API更加详细的解释,并结合实例讲解,告诉你如何使用该库函数。

编程基础

PCL库安装

根据PCL库起源于ROS,而ROS是基于Ubuntu的,所以我们安装PCL库在Ubuntu系统上十分简单,但是在windows上也是可以安装的,只是在很多小伙伴的吐槽和询问下,总结出windows配置PCL比容易出错。那么这两种环境的配置都是有博客分享的,可查看博主博客或微信公众号的历史消息查看文章,总之Ubuntu上安装只需几条命令行,windows下安装可能需要你半天甚至好几天。

Cmake基础

经常会有有人问到CMake的学习的问题,而且网上也有很多博客是介绍学习CMake 的用法,但是我觉的学习不用这样死板,用到了就顺便学习一下,也就是边做边学,由浅入深,慢慢的就会熟悉了,这个学习的过程中会遇到很多问题,以解决问题的方式驱动自己学习CMake,首先总结一下CMake 的好处,CMake是一个跨平台编译的工具,所以不再需要折腾平台了,比如Windows需要创建Visual Studio项目文件,配置环境等问题,Linux创建Makefile,OS X创建Xcode项目文件。实际上大部分你的配置都会是一样的,使用CMake会给你很好的项目维护性,也会降低你的维护成本。

Cmake 是kitware 公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一个独立的开放源代码项目。官方网站是www.cmake.org,可以通过访问官方网站获得更多关于cmake 的信息,

Cmake的特点

(1)开放源代码,使用类BSD 许可发布。http://cmake.org/HTML/Copyright.html

(2) 跨平台,并可生成native 编译配置文件,在Linux/Unix 平台,生成makefile,在苹果平台,可以生成xcode,在Windows 平台,可以生成MSVC 的工程文件。

(3) 能够管理大型项目。

(4) 简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。

(5) 高效虑,可扩展,可以为cmake 编写特定功能的模块,扩充cmake 功能。

最后就是C++编程的基础,需要慢慢积累,需要多看多写吧,希望大家和我共同学习,共勉!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 点云PCL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档