4. 点云预处理

原始点云从激光雷达、深度相机或结构光设备输出后,往往不能直接送入配准与融合模块。它通常带有测量噪声、密度不均、离群点、地面点以及数量庞大的冗余点。若跳过预处理,配准算法会因错误对应点而收敛到错误位姿,融合结果也会出现重影与拖尾。因此,点云预处理是三维感知流水线中决定后续精度与实时性的关键环节。

预处理的核心目标可以概括为四句话:去噪保形、降采样保特征、剔离群保对应、分地面保目标。它并不是简单“清洗数据”,而是在精度、速度与几何保真之间做权衡。

一、核心原理:为什么必须做预处理

点云配准依赖点与点之间的对应关系。噪声点会让法向量估计产生偏差,离群点会制造虚假对应,地面点会在配准时把两帧“拉平”而掩盖真实运动,点云密度过高则会让最近邻搜索耗时急剧上升。预处理正是从这四个方向降低配准的歧义性。

从信号角度看,点云是三维空间中的离散采样。滤波去噪相当于抑制高频测量噪声;下采样相当于降低采样率但保留几何骨架;离群点去除相当于剔除不符合局部统计规律的异常样本;地面分割相当于按语义把点云分成“支撑面”和“目标体”两类。四者顺序不同,效果差异明显。

点云预处理流水线:从原始帧到配准就绪数据 原始点云帧 噪声 / 离群 / 地面 密度不均 · 点数巨大 ① 滤波去噪 体素栅格 / 统计滤波 半径滤波 · 双边滤波 ② 下采样 体素降采样 均匀 / 随机 / 曲率采样 ③ 离群点去除 统计离群 SOR 半径离群 ROR ④ 地面分割 RANSAC 平面 法向 / 坡度约束 配准就绪点云 目标点云 + 源点云 · 法向量 · 关键点 关键参数与作用 体素边长 v:越大越稀疏、越快,但过大会丢失小目标与边缘特征 近邻数 k 与标准差倍数 σ:控制统计离群点的剔除强度 平面距离阈值 d 与迭代次数 N:决定地面分割的完整度与稳定性

二、方法流程:四步预处理的标准顺序

工程上推荐的处理顺序是:先粗去噪,再下采样,然后离群点去除,最后地面分割。原因在于:先下采样能显著降低后续统计滤波与 RANSAC 的计算量;而离群点去除放在下采样之后,可以避免稀疏区域被误删;地面分割放在最后,是因为它需要相对干净且密度均匀的点云来拟合平面。

  1. 滤波去噪:体素栅格滤波用体素内点云质心代替全部点,既降噪又降采样;统计滤波计算每个点到 k 个近邻的平均距离,剔除超出全局均值加 σ 倍标准差的点。
  2. 下采样:体素降采样最常用,通过设置体素边长控制输出密度;对特征敏感的场景可用曲率采样,在边缘与角点保留更多点。
  3. 离群点去除:统计离群点去除(SOR)适合去除稀疏噪声;半径离群点去除(ROR)适合去除孤立飞点,二者常组合使用。
  4. 地面分割:RANSAC 拟合最大平面作为地面,结合法向量与高度阈值剔除地面点,保留墙面、车辆、行人等目标点。

三、代码实操:PCL 风格预处理片段

下面以 PCL 风格伪代码展示一条完整预处理链,参数需按传感器型号与场景尺度调整:

// 1. 体素栅格滤波:降噪 + 降采样
pcl::VoxelGrid<PointT> vg;
vg.setInputCloud(cloud_in);
vg.setLeafSize(0.10f, 0.10f, 0.10f);   // 10cm 体素
vg.filter(*cloud_voxel);

// 2. 统计离群点去除
pcl::StatisticalOutlierRemoval<PointT> sor;
sor.setInputCloud(cloud_voxel);
sor.setMeanK(30);                      // 近邻数
sor.setStddevMulThresh(1.0);           // 标准差倍数
sor.filter(*cloud_clean);

// 3. RANSAC 地面分割
pcl::SACSegmentation<PointT> seg;
seg.setOptimizeCoefficients(true);
seg.setModelType(pcl::SACMODEL_PLANE);
seg.setMethodType(pcl::SAC_RANSAC);
seg.setDistanceThreshold(0.03);        // 3cm 平面内点阈值
seg.setInputCloud(cloud_clean);
seg.segment(*inliers, *coefficients);  // 地面内点索引

// 4. 提取非地面点,送入配准
pcl::ExtractIndices<PointT> ext;
ext.setInputCloud(cloud_clean);
ext.setIndices(inliers);
ext.setNegative(true);                 // 取反:保留非地面
ext.filter(*cloud_object);
体素边长不是越小越好。对于 16 线激光雷达,0.1~0.2 m 通常较合适;对于高线束雷达或深度相机,可适当减小到 0.03~0.08 m。参数应结合目标最小尺寸确定,一般体素边长不超过目标特征尺寸的三分之一。

四、案例与场景:室内建图与室外感知的差异

在室内 SLAM 场景中,地面平整、结构规则,RANSAC 平面分割效果稳定,体素边长可设为 0.05 m,SOR 的 k 取 20~30。此时地面点占比高,分割后能显著减少配准计算量。

在室外自动驾驶场景中,地面存在坡度与起伏,单一平面假设会失效。此时应改用分段平面拟合或基于法向量与坡度的地面分割,并保留地面点用于定位,仅将非地面点送入目标配准。下采样体素可放大到 0.15~0.25 m,以应对远距离稀疏点云。

处理步骤 典型方法 关键参数 主要作用
滤波去噪 体素栅格、统计滤波 体素边长、k、σ 抑制测量噪声,平滑局部表面
下采样 体素降采样、曲率采样 体素边长、采样比例 降低点数,提升配准速度
离群点去除 SOR、ROR 近邻数、半径、阈值 剔除飞点与虚假对应
地面分割 RANSAC、坡度法 距离阈值、迭代次数 分离支撑面与目标体

五、误区与复盘

常见误区一:先做地面分割再下采样。地面点数量庞大,直接 RANSAC 会非常耗时,应先降采样。误区二:把体素边长设得过大,导致小目标被“抹掉”,配准时找不到足够特征。误区三:SOR 的 σ 设得过小,把稀疏但真实的边缘点也删掉,造成配准退化。误区四:认为预处理越干净越好,过度滤波会削弱几何特征,反而降低配准精度。

复盘时应关注三个指标:预处理后点数与原始点数的比例、地面点剔除比例、配准后的均方误差与迭代次数。若配准误差偏大,优先检查离群点阈值与地面分割是否误删了目标点;若配准速度慢,优先检查下采样体素是否过小。只有把预处理参数与配准结果联动评估,才能形成稳定的数据准备流程。