前言

点云数据是三维视觉中的重要数据形式,常见于机器人、自动驾驶、三维扫描、测绘建模、工业检测等场景。PCL(Point Cloud Library)是一个面向点云处理的 C++ 开源库,提供了点云读写、滤波、搜索、特征、配准、分割、重建和可视化等功能。

这个专栏主要记录我学习和整理 C++ + PCL 点云处理 的过程。文章会尽量从基础概念讲起,再结合完整的 C++ 示例代码说明每个算法或功能的使用方法。

目前专栏先围绕三个方向展开:

  • PCL 基础使用
  • 点云滤波与预处理
  • 点云几何特征提取

后续内容会根据学习进度继续补充。


专栏定位

本专栏不是单纯罗列函数接口,而是希望按照“能看懂、能运行、能修改、能迁移到项目中”的思路来组织内容。

每篇文章会尽量包含:

  • 方法适用场景
  • 基本原理说明
  • PCL 中对应的类和函数
  • 关键参数解释
  • C++ 完整示例
  • CMake 配置
  • 运行结果说明
  • 常见问题记录

一、PCL基础篇

这一部分主要解决“如何开始使用 PCL”的问题,包括环境配置、点云文件读写、点云显示、常用点类型和基础数据结构。

1.1 PCL简介:为什么用PCL处理点云

  • PCL 的基本作用
  • PCL 能处理哪些点云任务
  • PCL 的主要功能模块
  • C++ 学习 PCL 需要具备的基础
  • PCL 在实际项目中的常见应用

1.2 Windows环境下搭建PCL开发环境

  • PCL 安装方式
  • Visual Studio 工程配置
  • 头文件路径设置
  • 库文件路径设置
  • 动态库路径问题
  • 常见配置错误排查

文章链接:持续更新中


1.3 PCD点云文件的读取、显示与保存

  • PCD 文件的基本概念
  • 使用 PCL 读取点云文件
  • 使用 PCL 保存点云文件
  • PCLVisualizer 可视化点云
  • 点云读写完整示例

文章链接:持续更新中


1.4 PCL常用点类型整理

  • PointXYZ
  • PointXYZRGB
  • PointXYZI
  • PointNormal
  • PointXYZRGBNormal
  • 如何根据任务选择点类型

文章链接:持续更新中


1.5 pcl::PointCloud基础操作

  • 点云对象的创建
  • 点云宽度、高度和点数量
  • 遍历点云中的点
  • 添加、修改和访问点
  • 判断点云中的无效点
  • 有序点云和无序点云的区别

文章链接:持续更新中


1.6 PCLVisualizer可视化入门

  • 创建可视化窗口
  • 设置点云颜色
  • 设置点大小
  • 添加坐标轴
  • 显示多个点云
  • 可视化窗口交互操作

文章链接:持续更新中


二、点云预处理篇

原始点云通常会存在噪声、离群点、数据量过大、空间范围不符合需求等问题。因此,在配准、分割、识别和重建之前,通常需要先对点云进行预处理。

2.1 点云预处理的基本流程

  • 为什么要做预处理
  • 原始点云中常见的问题
  • 点云裁剪、滤波、下采样的区别
  • 预处理在点云任务中的位置
  • PCL 中常用预处理方法概览

文章链接:持续更新中


2.2 使用PassThrough进行坐标范围裁剪

  • 直通滤波的使用场景
  • 按 X、Y、Z 方向筛选点云
  • PassThrough 类的基本用法
  • filterFieldName 与 filterLimits 参数
  • 裁剪前后结果对比

文章链接:持续更新中


2.3 使用VoxelGrid进行体素下采样

  • 下采样的目的
  • 体素网格的基本思想
  • VoxelGrid 类的使用方法
  • leaf size 参数如何设置
  • 下采样对点云数量和形状的影响

文章链接:持续更新中


2.4 使用StatisticalOutlierRemoval去除离群点

  • 离群点的特点
  • 统计滤波的基本思想
  • MeanK 参数含义
  • StddevMulThresh 参数含义
  • 去噪前后点云效果对比

文章链接:持续更新中


2.5 使用RadiusOutlierRemoval进行密度滤波

  • 基于半径邻域的滤波思想
  • RadiusSearch 参数设置
  • MinNeighborsInRadius 参数设置
  • 半径滤波适合处理哪些点云
  • 与统计滤波的使用区别

文章链接:持续更新中


2.6 使用ConditionalRemoval进行条件筛选

  • 条件滤波的适用场景
  • 设置单个过滤条件
  • 设置多个组合条件
  • 保留符合条件的点
  • 删除不符合条件的点

文章链接:持续更新中


2.7 使用ExtractIndices提取指定点集

  • 点云索引的作用
  • 根据索引提取点云
  • 根据索引删除点云
  • negative 参数的使用
  • 与分割算法结合使用的场景

文章链接:持续更新中


三、点云特征篇

点云特征用于描述局部或整体几何结构,是配准、识别、分割、重建等任务的重要基础。本部分主要整理 PCL 中常用的几何特征计算方法。

3.1 点云特征的基本概念

  • 什么是点云几何特征
  • 局部特征和全局特征
  • 法向量、曲率、关键点、描述子的关系
  • 特征提取在点云处理流程中的作用
  • PCL feature 模块简介

文章链接:持续更新中


3.2 使用NormalEstimation估计法向量

  • 法向量的几何意义
  • 邻域搜索方式
  • KSearch 与 RadiusSearch 的区别
  • NormalEstimation 类的使用方法
  • 法向量结果的显示方法

文章链接:持续更新中


3.3 点云曲率的计算与理解

  • 曲率在点云中的含义
  • 曲率和局部表面变化的关系
  • Normal 结构中的 curvature 字段
  • 曲率结果如何分析
  • 曲率在边缘和区域分析中的应用

文章链接:持续更新中


3.4 使用ISS提取三维关键点

  • 为什么需要关键点
  • ISS 关键点的基本思路
  • ISSKeypoint3D 类的使用方法
  • salient radius 和 non max radius 的设置
  • 关键点可视化方法

文章链接:持续更新中


3.5 使用FPFH描述局部几何特征

  • FPFH 描述子的作用
  • 计算 FPFH 之前为什么需要法向量
  • FPFHEstimation 类的使用方法
  • 搜索半径对结果的影响
  • FPFH 在粗配准中的常见用法

文章链接:持续更新中


3.6 PFH与FPFH的区别

  • PFH 的基本思想
  • FPFH 的改进思路
  • 两者计算效率对比
  • 两者使用场景对比
  • PCL 中相关类的使用方式

文章链接:持续更新中


3.7 特征提取综合示例

  • 点云读取
  • 点云预处理
  • 法向量计算
  • 关键点提取
  • FPFH 特征计算
  • 完整 C++ 工程组织

文章链接:持续更新中


四、后续准备补充的内容

前三个部分会优先整理。后面如果时间允许,会继续补充下面几个方向。

4.1 点云配准

  • ICP 配准
  • NDT 配准
  • 基于特征的粗配准
  • 粗配准与精配准结合
  • 配准结果评价

文章链接:持续更新中


4.2 点云分割

  • 平面模型分割
  • 欧式聚类
  • 区域生长
  • 条件欧式聚类
  • 常见几何模型分割

文章链接:持续更新中


4.3 三维重建

  • 点云平滑
  • 法向量一致性处理
  • 贪婪投影三角化
  • 泊松重建
  • 网格模型保存

文章链接:持续更新中


4.4 工程实践记录

  • CMake 工程模板
  • 点云批量处理
  • PCL 与 Eigen 配合使用
  • PCL 与 ROS 配合使用
  • 常见编译和运行错误整理
  • 实际项目中的点云处理流程

文章链接:持续更新中


五、建议学习顺序

如果是从零开始学习 C++ PCL,可以按照下面的顺序进行:

  1. 配置 PCL 开发环境
  2. 跑通点云读取、显示和保存程序
  3. 熟悉 pcl::PointCloud 和常用点类型
  4. 学习常见滤波和下采样方法
  5. 学习法向量、曲率、关键点和特征描述子
  6. 再继续学习配准、分割和重建
  7. 最后结合实际数据和项目需求进行综合练习

六、持续更新说明

这篇文章作为专栏目录使用,后续每完成一篇文章,都会把对应链接补充到目录中。

专栏前期会优先更新:

  • PCL 基础使用
  • 点云预处理
  • 点云特征提取

后续会继续整理点云配准、点云分割、三维重建和工程实践相关内容。

更多推荐