一、点云概念
点云Point Cloud是三维空间中,表达目标空间分布和目标表面特性的点的集合,点云通常可以从深度相机中直接获取,也可以从CAD等软件中生成。点云是用于表示多维点集合的数据结构,通常用于表示三维数据。在3D点云中,这些点通常代表采样表面的X,Y和Z几何坐标。当存在颜色信息时(请参见下图),点云变为4D。
三维图像有以下几种表现形式:深度图(描述物体与相机的距离信息),几何模型(由CAD等软件生成),点云模型(逆向工程设备采集生成),一些常见的点云图如下:
人的侧脸3D | 一只兔子3D | 桌子及牛奶4D |
---|---|---|
![]() |
![]() |
![]() |
二、什么是PCL (Point Cloud Library)
1. 基础概念
PCL(Point Cloud Library)是用于2D / 3D图像和点云处理的大型开源跨平台的C++编程库。 PCL框架实现了大量点云相关的通用算法和高效的数据结构。内容涉及了点云的获取、滤波、分割、配准、检索、特征提取、特征估计,表面重建、识别、模型拟合、追踪、曲面重建、可视化等等,这些算法可用于从嘈杂的数据中过滤出异常值,将3D点云缝合在一起,分割场景的部分区域,提取关键点并计算描述符,根据物体的几何外观识别实际物体,创建表面点云并将其可视化。支持多种操作系统,可以在Windows、Linux、MacOS X、Android、部分嵌入式实时系统上运行。
如果说OpenCV是2D信息获取与处理的结晶,那么PCL就在3D信息获取与处理上也具有相同的地位。相比图像数据,点云数据多了一个维度,因此能够更全面的刻画三维场景中的对象。随着智能机器人,包括机械臂,无人汽车,无人机,服务机器人等快速普及和应用,点云处理及其背后的3D视觉,正在成为一个越来越重要且越来越活跃的领域。
此外,PCL是BSD授权方式,可以进行完全免费的商业和学术应用。
2. PCL的起源与发展
PCL 起初是 ROS(Robot Operating System )下由来自斯坦福大学的年轻博士Radu等人维护和开发的开源项目。主要应用于机器人研究应用领域,随着各个算法模块的积累,于 2011 年独立出来,正式与全球 3D信息获取处理的同行一起,组建了强大的开发维护团队,以多所知名大学、研究所和相关硬件、软件公司为主。截止目前 , 发展非常迅速,不断有新的研究机构等加入,在 Willow Garage,Nvidia, Google, Toyota, Trimble, Urban Robotics, Honda Research Institute 等多个全球知名公司的资金支持下,不断提出新的开发计划,代码更新非常活跃 , 至今(2019年10月)从 1.0 版本已经发布到 1.9.1 版本。
该项目是由来自许多不同组织的众多工程师和科学家开发的,分布在世界各地,包括:

🚀 Learning Tisps:
三、环境搭建
1. Windows环境搭建
a. 安装 VCPKG
为了解决这样的问题,微软C++ 团队开发了适用于C 和C++ 库的跨平台开源软件包管理器,它大大简化了Windows、Linux 和macOS 上第三方库相关的下载和配置操作。如果项目要使用第三方库,现在我建议各位读者通过 vcpkg来安装它们。vcpkg可以单独使用,也可以在vscode中使用。
操作命令:
git clone https://github.com/microsoft/vcpkg
cd vcpkg/
./bootstrap-vcpkg.sh
./vcpkg --version #(windows)是./vcpkg.exe --version 查看当前 VCPKG 版本
🌻 Tips:
因为vcpkg在linux系统上默认安装库文件的release和debug版本,并且调用安装库时会默认调用debug版本(不知道具体原因),会给代码测试带来很大困扰,因此在正式使用vcpkg之前我们需要对vcpkg\triplets文件夹下的x64-linux.cmake文件进行修改。
手动打开vcpkg\triplets\vcpkg\triplets文本进行编辑,在最后一行输入 set(VCPKG_BUILD_TYPE release)
b. 安装依赖库 & PCL
vcpkg
可以通过下面的方法找到能够安装的库
.\vcpkg search
# .\vcpkg help triplet
常见的库基本都有,Ogre、Osg、OpenCV、PCL、Eigen、Ceres、g2o等等,这些库的安装直接敲命令,内部所有依赖关系都被人维护并测试通过.
🚀 然后就可以通过下面的指令完成安装,vcpkg默认把开源库编译成x86的Windows版本的库 【一定要用VPN@ClashForLinux】
.\vcpkg install 库名字:架构-平台-是否静态库
# .\vcpkg install PCL:x64-windows-static
./vcpkg install pcl --triplet x64-windows # 安装 PCL 库 并在所有 Visual Studio 创建的工程中包含该库
如果移除一个已经安装的开源库,那么执行remove指令即可。比如我们要移除PCL,那么执行命令:
.\vcpkg remove 库名字
# .\vcpkg remove PCL
# .\vcpkg remove --outdated # 如果想要一键移除“过时”的包
⭐ Notice:
如果你想使用VS,打开任何新建工程都有环境的话,可以使用 ./vcpkg integrate install XXLibrary
c. Vcpkg环境集成
上面我们已经安装了一些第三方库,那如何使用呢?常规情况下,我们需要设置include目录、lib目录等,会有很多工作量。Vcpkg提供了一套机制,可以全自动的适配目录,而开发者不需要关心已安装的库的目录在哪里,也不需要设置。这是Vcpkg的一大优势。
如果你想使用VS,打开任何新建工程都有环境的话vcpkg integrate install只是想让某一个project有环境的话vcpkg integrate project然后在*\vcpkg\scripts\buildsystems目录下会有.nupkg文件,借助VS的nuget管理器导入该配置文件即可。打开Visual Studio,点击菜单“工具->NuGet包管理器->程序包管理器设置”,进入设置界面,点击“程序包源”。

2. Ubuntu@JetsonNano 环境搭建
a. 基本条件准备
- PCL版本:
pcl-1.11.0
- 基础依赖安装 install_pcl_dependences.sh:
sudo apt-get update sudo apt-get install git build-essential linux-libc-dev sudo apt-get install cmake cmake-gui sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev sudo apt-get install mpi-default-dev openmpi-bin openmpi-common sudo apt-get install libpcap-dev sudo apt-get install libflann1.9 libflann-dev sudo apt-get install libeigen3-dev sudo apt-get install libboost-all-dev sudo apt-get install vtk6 libvtk6.3 libvtk6-dev libvtk6.3-qt libvtk6-qt-dev sudo apt-get install libqhull* libgtest-dev sudo apt-get install freeglut3-dev pkg-config sudo apt-get install libxmu-dev libxi-dev sudo apt-get install mono-complete sudo apt-get install libopenni-dev libopenni2-dev
- 下载 PCL 源代码:
git clone https://github.com/PointCloudLibrary/pcl.git
b. 编译安装
I. Compile
cd pcl
git checkout pcl-1.11.0
mkdir release
cd release
cmake -DCMAKE_BUILD_TYPE=None \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DBUILD_GPU=ON \ -DBUILD_apps=ON \ -DBUILD_examples=ON .. # 配置cmake
make # 进行编译 ,也可以`make -j11`11为内核数 按自己的cpu内核填写 不写数字默认使用全部核心编译
II. Install
make install
/usr/local/include/pcl-1.11.0 # pcl 安装路径
c. 程序测试
调用基本自带的PCD文件测试 pcl_viewer ../test/pcl_logo.pcd

https://blog.csdn.net/taifyang/article/details/113854969
e. Install Error
⭐ Quetion001
编译出现了 C++: internal compiler error: Killed (program cc1plus)
:

考虑到可能是内存不足导致的结果,增加交换空间来解决这个问题,如下所示:
# 1. 创建分区
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 # 1 * 1024 = 1024 创建 1 g 的内存分区
sudo mkswap /swapfile
sudo swapon /swapfile
#free -m #可以查看内存使用
#创建完交换分区之后就可以继续编译
#编译若是还不成功,试着创建更大的分区,比如count=2048
#2g的分区,基本可以解决。
#2. 关闭分区
sudo swapoff /swapfile
sudo rm /swapfile
🌻 注意: 编译完之后记得用以上命令关闭交换分区