尧图精选

PFH、FPFH、VFH、PPF四种点云特征描述子对比与应用选型

🕒 发布时间:2026/10/1 19:26:23 📁 来源:尧图网络
1. 先弄清楚这四兄弟到底解决什么问题三维特征描述子这个术语只要做过点云处理和三维视觉早晚都会撞上。PFH、FPFH、VFH、PPF这四个缩写尤其常见几乎每隔一段时间就会出现在配准、目标识别和机械臂抓取相关的文章或代码里。我第一次接触它们时以为是一种东西的四种叫法后来才发现它们各自解决的是不同层面的问题从局部几何编码到全局目标识别从直方图统计到位姿投票差异非常大。这篇文章不会照着论文念公式而是从我把它们一个个用在真实项目里的视角说说每个描述子到底适合干什么、需要怎么调。1.1 从一次失败的配准说起几年前我做过一个两片点云的拼接项目。两组点云重叠率不错ICP一开始给了一个还行的初值结果迭代了五十次还是差着一截。后来换了个思路先提取关键点用FPFH计算特征然后基于特征匹配找到对应点对再用RANSAC估计粗位姿最后跑ICP精配准问题一下就解决了。那次经历让我意识到点云里的原始坐标虽然直观但真的不适合直接拿来跨视角匹配。同一个点在两个视角下的坐标完全不同直接对坐标做最近邻搜索得到的对应关系基本是错的。这时就需要一个中间表示计算每个点邻域的几何属性把它写成一条向量让同一个物理点在两个视角下的特征尽量接近。这就是特征描述子的价值。PFH、FPFH、VFH、PPF都是这一类工具只是各自选择了不同的方式去描述几何。1.2 笛卡尔坐标、法线、曲率之外为什么还需要描述子可能有朋友会问点云里不是已经有法线和曲率了吗为什么还要搞出这么多复杂的直方图原因很简单法线和曲率是单个点的属性对噪声和点密度变化很敏感。同一个平面在稀疏点云和密集点云里估计出来的法线方向可能差出好几度再加一点高斯噪声曲率变化更大。用这些单值特征做匹配误匹配率相当高。描述子的思路是“统计”。不看单个值而是看一个小邻域内所有点的几何关系分布。比如PFH会把邻域内所有点对的法线夹角、距离等信息统计成直方图。这样即使个别点的法线估计略有偏差直方图的整体形状不会剧烈变化。相当于把几十上百个点的信息压缩成一个稳定的“签名”。这种统计特性是原始坐标和单点几何特征不具备的。1.3 局部vs全局PFH/FPFH与VFH/PPF的分野刚开始容易混淆的是既然都叫“特征”它们是不是可以互相替换实际不是。PFH和FPFH是局部描述子给一个查询点只对它周围的局部邻域编码适合做点配准、关键点匹配。VFH是全局描述子输入是完整的目标点云输出是一整条直方图适合做物体识别和分类。而PPF有点特殊它虽然也是用点对关系建模型但工作模式是“离线建哈希表、在线投票”主要用来做6D位姿估计尤其适合机械臂抓取场景。所以这四样东西任务场景完全不同。在选型之前先搞清它们各自解决什么问题比直接上手调参重要得多。2. PFH点特征直方图的数学骨架和复杂度瓶颈PFH全称Point Feature Histogram在PCL早期版本里是核心描述子之一。它把一个查询点邻域内任意两点之间的几何关系全部考虑进去然后统计成直方图。优点是信息丰富、区分度高缺点也很明显计算量太大。2.1 Darboux框架与四元组PFH到底在算什么要理解PFH先要理解它怎么描述两个点之间的关系。给定查询点p_q找出半径r内所有邻域点。对这k个点中的任意一对(p_i, p_j)假设已经通过法线估计得到了它们的单位法线n_i和n_jPFH会先建一个以p_i为原点的局部坐标系也叫Darboux框架u n_iv (p_j - p_i) × u / || (p_j - p_i) × u ||w u × v然后计算四个量α v · n_jφ u · (p_j - p_i) / dθ atan2(w · n_j, u · n_j)d ||p_j - p_i||其中d是两点距离。前三个量是角度相关量第四个是距离。PCL默认只对α、φ、θ三个角度做直方图统计把每个角度范围分成5个子区间三个维度组合起来就是5×5×5125个区间也就是125维直方图。如果像某些实现那样把距离d也分5个区间维度就会变成625信息量更大但计算和存储开销也更大。为什么要用Darboux框架而不是直接在全局坐标系下算夹角因为全局坐标与物体的姿态、视角绑定同一物体转过一个角度后全局坐标下的值全变了。而Darboux框架由两个点的法线和连线方向决定具有一定的旋转不变性这才能保证描述子对视角变化稳。2.2 直方图化为什么能抗噪声、抗密度变化PFH最核心的设计是“统计”而不是“记录”。它没有把每对点的原始角度值存下来而是统计落在每个区间里的点对数。这样带来的直接好处是如果某个点的法线因为噪声偏了几度它可能只是从一个直方图区间滑到隔壁区间整体的分布形状变化很小。如果某个区域点云密一点多出来的点对也只会让对应区间的高度增加而不会引入完全不同的模式。这也是为什么PFH在特征匹配时往往比直接用法线/曲率向量更稳。当然稳定性是有代价的直方图分bin的粒度也会决定区分度。bin太粗不同形状的特征都挤在一起bin太细稍微一点噪声就换区间。PCL默认的5个bin是在很多实验里折中的结果实际使用时不一定最优需要根据点云规模和几何复杂度调整。2.3 O(nk^2)的代价半径、邻域数量对性能的影响PFH的计算过程里对每一个查询点都要遍历它邻域内所有点对。假设邻域内有k个点点对数量就是k(k-1)/2。整个点云有n个点时间复杂度就是O(nk^2)。k通常由特征计算半径r决定半径稍微大一点邻域内可能就有几百个点点对数量会到几万甚至更多。我在自己的笔记本上跑过一帧几千个点的点云PFH都觉得卡更不用说上百万点的场景。所以用PFH之前一定要想清楚两个参数。第一是特征半径r它决定了邻域范围直接影响能看到的几何尺度。第二是法线估计用的半径通常可以和特征半径一致或者略小。如果法线半径比特征半径小太多邻域边缘点的法线会受噪声影响严重。反过来如果法线半径太大会把远处的几何混进来导致小结构被平滑掉。2.4 PCL中PFH的典型调用与常见坑用PCL算PFH的代码框架一般是这样先用NormalEstimation估计法线然后构造PFHEstimation对象把点云和法线都传进去设置查询点集合和搜索半径调用compute得到PFHSignature125。我第一次跑的时候踩过两个坑。第一个是忘了给法线估计设置和特征计算一样的搜索半径导致每个点的法线邻域范围非常稀疏算出来的直方图噪声很大。第二个是只对关键点计算特征却把搜索树建立在所有点上结果每个关键点的邻域总是包含大量无关背景点特征被稀释。正确做法是如果只想对关键点算特征搜索树里仍然可以是全量点云但要保证半径内是目标表面必要时先做下采样和裁剪。另外PFH的125维直方图在特征匹配时通常要配合归一化。PCL默认输出的是每个bin的归一化频率和落在该区间的点对数量的比值。但如果邻域点的数量差异大即使归一化后不同密度下直方图的形状也可能有系统性偏差所以很多项目会先用体素滤波统一点云密度再做特征计算。3. FPFH从PFH到快速版本算法做了哪些妥协FPFH全称Fast Point Feature Histogram是PFH的加速改进版。它的核心思想是不再计算邻域内所有点对而是只计算查询点与每个邻域点之间的简化特征再用邻域点的简化特征做加权融合最终得到一个33维的直方图。复杂度从O(nk^2)降到O(nk)。3.1 SPFH只算查询点与邻域点之间的简化特征FPFH的第一步是对于每个点p计算它与邻域内每个点p_i之间的α、φ、θ三个角度特征然后把这三个角度的统计结果分bin得到一条直方图叫SPFH(p)Simplified Point Feature Histogram。注意这里不计算邻域点之间的相互特征所以计算量从k(k-1)降到k。PCL实现里SPFH的三个角度特征各分11个bin因此SPFH是33维。很多资料把SPFH看作PFH的“一次近似”。它确实丢失了邻域内部点与点之间的直接几何关系损失了一些局部结构信息。比如一个邻域里如果有很多点PFH能捕捉这些点之间细微的排列差异而SPFH只能捕捉查询点与邻域点的关系。对很相似的几何结构SPFH的区分度会低于PFH。3.2 邻域加权公式FPFH如何恢复上下文如果只用SPFH每个点只看到了自己和邻域的关系感受野很有限。FPFH的巧妙之处在于它再进行一次邻域融合。对点p重新遍历它的邻域点p_i把这些邻域点的SPFH(p_i)加权求和再加到自己的SPFH上。公式是FPFH(p) SPFH(p) (1/k) * Σ (1/ω_i) * SPFH(p_i)这里的ω_i一般取p和p_i之间的距离。距离越远权重越小。这个加权操作等于让每个点的描述子包含了一点周围点的“邻居信息”相当于扩大了感受野。虽然还是没有PFH那样完全成对的几何关系但在区分度上非常接近PFH而计算速度快得多。我在实际项目里经常用FPFH替代PFH。除非是特别刁钻的几何比如对称结构或者极度相似的平面组合FPFH的匹配结果和PFH差别不大。而且33维比125维更小后面做匹配或训练分类器都更快。3.3 FPFH和PFH的精度对比以及为什么FPFH更流行FPFH比PFH快了一个数量级这是它流行的主要原因。在实时配准、SLAM前端、物体识别这类场景计算时间往往比理论精度更重要。我在一个激光雷达里程计项目里用FPFH做特征匹配单帧几千个关键点耗时能控制在几十毫秒级别换成PFH直接慢到不可用。但要说FPFH一定比PFH差也不绝对。因为FPFH的直方图维度更低bin更宽对噪声的容忍度反而可能更高。在一些实际测试中FPFH的匹配成功率和PFH相当甚至更好。关键在于邻域加权公式让它有了更大的上下文信息而PFH如果半径选得不好反而容易陷入局部细节。所以现在工程里PFH更多出现在教学和理论对比中FPFH才是真正被大规模使用的局部特征。3.4 参数调整经验法线半径、特征半径到底怎么给FPFH的参数和PFH类似主要是法线估计半径和特征计算半径。我的经验是特征半径通常取点云平均间距的10到20倍。如果点云是5mm分辨率特征半径给50mm左右比较合适法线估计半径可以取特征半径的一半到相等但不要太小否则法线噪声会直接传导到直方图。另一个容易被忽略的点是FPFH要求输入点云有准确的坐标值尤其是点密度均匀。我通常会先做体素滤波让点间距趋于统一再估计法线最后算特征。如果点云来自不同传感器拼接密度差异极大FPFH会出现严重的偏差这时优先检查的是预处理而不是调直方图bin数。4. VFH把视点编码进直方图的全局描述子VFH全称Viewpoint Feature Histogram名字里带“Viewpoint”不是没原因的。PFH、FPFH这类局部描述子目标是做到旋转不变。而VFH反其道而行特意把传感器视点方向作为一个重要特征放进去配合目标点云的整体几何信息得到一个全局描述子。这种特征特别适合“这个物体是什么”这种分类问题。4.1 目标识别需要什么样的描述子想象一个场景传送带上是各种机械零件相机拍到一个目标点云需要判断它是螺栓还是垫片。这种任务不需要知道目标在点云里的精确坐标对应关系只需要一个能区分类别的“指纹”。局部描述子可以用于匹配但要对每个关键点算特征再做投票流程长。VFH直接对整块目标点云计算一个全局向量用分类器或者最近邻检索就能判别简单直接。VFH还有一个重要假设输入点云必须是从某个视点看到的完整或接近完整目标表面。传感器在哪个位置视点方向就是什么这个信息被编码进描述子所以VFH对视角变化非常敏感。这正好用于识别“从某个角度看到的物体”但同时也意味着如果目标被严重遮挡VFH的稳定性会下降。4.2 VFH的组成视点方向分量与扩展表面形状分量VFH的直方图由两部分组成。第一部分是视点方向分量计算视点方向通常是传感器到点云质心的方向与每个点法线之间的夹角然后统计成直方图。在PCL实现中这个分量默认分成45个bin。第二部分是扩展的局部形状分量对点云里每个点计算类似SPFH的特征再汇总。因此VFH的输出维度不是一个小数字PCL默认是308维前面45维是视点分量后面是扩展FPFH分量。这里有一个容易误解的点VFH并不是把FPFH的33维直接拿来用。它是把FPFH的组件扩展成更细的bins然后再加上视点分量。所以在PCL里VFH的命名是VFHSignature308而不是一个简单的“FPFH加视点”。使用VFH时通常要把输出向量做归一化否则视角远近会导致某些bin的值普遍偏大或偏小。4.3 用VFHSVM做物体分类的完整流程我做过一个VFH的物体分类Demo流程大概是这样从场景点云中分割出目标得到目标的点云簇。对目标点云做体素滤波和法线估计。用VFHEstimation计算308维特征得到一个全局描述子。对每个类别采集多组样本把特征和标签交给SVM训练。在线识别时同样分割出候选目标计算VFH特征用训练好的SVM分类。实测下来如果目标形状差异明显、遮挡少识别率很高如果目标形状相似比如多种规格的六角螺栓VFH的特征差异会变小需要增加样本量和特征归一化的处理。VFH效果好的前提是分割质量。如果分割把两个物体粘在一起VFH会把它们当成一个整体分类结果就会随机。所以实际项目里VFH前面通常要接一个稳健的欧几里得聚类或者平面去除甚至要用深度学习做实例分割。4.4 VFH的局限遮挡、多目标与分割依赖VFH的一个天然弱点是遮挡。它是全局描述子目标点云里缺掉一大块直方图的形状就会发生明显变化。现实场景中的物体常常被部分遮挡VFH的识别精度会下降。另一个限制是它对多目标不友好一帧点云里有三个物体必须先分出来分开算逐个识别计算量也跟着上去。所以现在的工程里VFH多用于比较“干净”的识别场景比如流水线上的单目标分类。如果场景杂乱、遮挡严重更多人会转向PPF这类方法或者直接用深度学习。不过VFH依然是个经典且可解释性强的基线方案对快速原型验证很有价值。5. PPF点对特征用全局投票绕开局部邻域的脆弱性PPF全称Point Pair Feature严格来说它不是传统意义上的“描述子”而是一套基于点对的位姿估计方法。它的思路和前面的PFH/FPFH/VFH都不一样不构建点的直方图而是用点对特征建哈希表在线通过投票找6D位姿。5.1 Point Pair Feature的定义与局部坐标系PPF描述的是两个有向点带法线的点之间的空间关系。对模型上的两个点m1和m2法线分别是n1和n2定义F(m1, m2) (||d||2, ∠(n1, d), ∠(n2, d), ∠(n1, n2))其中d m2 - m1。也就是说PPF由四部分组成两点距离、第一条法线与连线方向的夹角、第二条法线与连线方向的夹角、两条法线之间的夹角。这四个量在刚体变换下是不变的因为距离和夹角都是刚体不变量。这个特征非常简洁。它不需要像PFH那样统计邻域点对只需要一对点就够了。这也是PPF能全局建模的原因只要模型点云有一定密度任意两点都能组成PPF相当于把整个模型的几何关系都编码进去。但前提是模型的法线估计要准否则角度特征会崩。5.2 离线训练哈希表与量化步长PPF的离线阶段会遍历模型上的所有点对或者采样后的点对计算每个点对的特征F。为了能在线上快速检索需要把特征F量化然后用哈希表存储。具体来说距离d量化成多个间距三个角度各量化成多个角度区间于是每个PPF都能得到一个离散的索引值。哈希表的每个键对应一组模型点对以及它们在模型坐标系下的相对位姿信息。量化步长的选择非常关键。距离步长太大不同几何关系会撞到同一个槽距离步长太小哈希表会爆炸而且对噪声极敏感。一般实践里距离步长可以和点云平均间距关联比如取平均间距的2-4倍角度步长取10到15度。我做过一个抓取项目模型点云约2万个点采样后只保留几千个点点对数量仍然很大只能再用离散采样控制数据量。5.3 在线位姿投票从场景点对到6D位姿假设在线阶段从场景点云采样一个参考点s_r再与场景中另一个点s_i组成点对计算PPF去哈希表里找所有特征相似的模型点对。对每一组匹配都尝试计算一个“把模型点对变换到场景点对位置”的旋转角α。因为两个点对一旦特征一致在固定参考点局部坐标系下对应的姿态差异只可能是一个绕参考点法线的旋转角。把这个α累加到一张投票表里遍历足够多的场景点对后投票高峰对应的α就给出了一个可能的位姿假设。这个过程会为每个场景参考点生成多个候选位姿最后再做聚类、打分挑出置信度最高的位姿假设通常还会接ICP精配准把位姿细化。PPF之所以对遮挡鲁棒是因为它每对点都独立投票即使场景里有大量杂波点只要有一部分点对落在目标上投票峰还是会显现出来。5.4 PPF在杂乱堆叠场景中的实测表现我在一个散乱零件抓取项目里试过PPF。现场零件堆在一起互相遮挡严重相机拍到的点云只有每个零件的一部分露在外面。用FPFH匹配基本没法用但PPF能稳定给出多个零件的位姿配合ICP精配准后抓取成功率能达到可用水平。当然过程没那么顺利需要反复调采样密度、哈希表参数和投票阈值。一个比较常见的坑是如果模型点云和场景点云的分辨率不一致PPF的距离特征会出现系统性偏差。场景点云是0.5mm分辨率模型是CAD采样出来的1mm分辨率直接匹配效果会变差。解决方法是先对两者做体素滤波统一到相近分辨率或者对场景做上采样/下采样。5.5 一个容易混的缩写此PPF非SAP的PPF最后提一句如果你去搜“PPF”可能会搜到SAP系统里的Post Processing Framework那是一个企业级软件里的流程处理框架和三维视觉完全无关。很多刚接触点云的网友会被SAP的PPF文档干扰其实连资料库都不一样搜索引擎返回的排序有时候也会误导人。在点云和机器人领域PPF几乎都指Point Pair Feature。建议检索时加上3D、point cloud、robot vision这类词能过滤掉大部分无关内容。6. 遇到真实任务怎么选配准、识别、抓取的选型经验把四个特征放在一起看选哪个其实不是好不好而是合不合适。下面是我在项目里的实际对比和经验总结。6.1 四者核心特性对比用一张表可以看得很清楚描述子类型维度计算复杂度主要用途典型应用PFH局部125维O(nk^2)精确配准、关键点匹配离线配准、高精度重定位FPFH局部33维O(nk)实时配准、SLAM激光里程计、粗配准VFH全局308维依赖点云规模目标分类/识别零件分拣、ID识别PPF点对/全局4维特征哈希表离线建模在线投票6D位姿估计机械臂抓取、杂乱场景表格里FPFH维度是33PFH是125VFH是308PPF的特征本身只有4维但配合哈希表和投票才完整。复杂度这一列PPF无法直接用O表示所以写的是建模投票的模式。6.2 按任务选型配准、识别、位姿估计分别选谁如果你的任务是两个点云配准比如机器人定位或者三维重建先考虑FPFH。它速度快支持实时配合RANSAC粗配准效果很好。只有在精度要求极高、且离线计算可以接受时再研究PFH。如果你的任务是识别“这是什么物体”优先考虑VFH。但前提是你能提供一个相对干净的目标点云并且类别之间的几何形状差异足够大。如果类别相近、背景复杂建议先做分割再考虑VFH或转向深度学习方法。如果你的任务是机械臂抓取、乱序上下料这类需要精确6D位姿的场景直接看PPF。它对遮挡和杂乱环境更鲁棒尤其是当物体堆叠、相互遮挡时FPFH和VFH通常都会失效而PPF的投票机制还能撑住。6.3 常见失败模式与排查路径实际工程里特征算法不work时大概率不是特征本身的问题而是输入没处理好。我总结过几个高频失败点法线方向不一致。很多传感器点云存在法线正负翻转需要使用法线方向重定向比如朝向视点统一。点云密度差异大。特征是针对邻域统计的密度不均有偏差先体素滤波。半径没匹配尺度。不同传感器下同一物体的点间距不同特征半径需要按点间距比例缩放而不是固定一个毫米数。计算特征前没有裁剪。目标周围一堆背景点所有邻域统计都被污染分割/裁剪很关键。排查时先检查可视化的法线再检查特征匹配结果最后才调具体参数。直接上来改bin数往往事倍功半。6.4 最后分享一次调优复盘我最近一次用FPFH做点云配准开始总是匹配失败。后来把关键点从原始点云换成基于法线夹角的关键点提取再统一体素分辨率召回率立刻上去了。这个改动和FPFH本身没关系但说明一个问题描述子只能保证“算出来的特征有意义”不能保证“输入的几何够干净”。最终效果是由预处理、特征、配准整个链路决定的。如果非要说一个优先推荐我会建议先把数据预处理和法线质量做到90分再讨论PFH还是FPFH否则后面都是白费功夫。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →