第三章:图像特征提取——角点检测与特征描述子

各位同学,欢迎来到视觉伺服控制的核心环节。图像特征提取,说白了就是让机器人“看懂”画面里的关键信息。你想想看,如果机器人看每一帧图像都像看一张白纸,那它根本没法定位、没法跟踪。所以,这一章我们聊聊角点检测、SIFT、ORB这些经典算法。

我个人习惯把特征提取分成两步:找特征点描述特征点。找点容易,但怎么让这些点在不同视角下还能被认出来,才是真功夫。

3.1 角点检测:Harris与Shi-Tomasi

角点,就是图像里那些“拐弯抹角”的地方。比如桌角、窗户角、棋盘格的内角点。为什么选角点?因为它在平移、旋转下相对稳定。

3.1.1 Harris角点检测

Harris算法的核心思想很简单:用一个窗口在图像上滑动,看窗口内灰度变化有多大。如果往哪个方向滑,灰度都剧烈变化,那就是角点。

数学上,它构造了一个自相关矩阵M:

M = ∑ [Ix²  IxIy]
        [IxIy Iy² ]

然后计算响应值R:

R = det(M) - k * (trace(M))²

这里的k是个经验常数,我一般取0.04~0.06。R大于阈值,就是角点。

我的经验:Harris对光照变化比较敏感。我在做室内机器人导航时,遇到过灯光忽明忽暗导致角点数量剧烈波动的情况。后来加了自适应阈值,才稳定下来。

3.1.2 Shi-Tomasi角点检测

Shi-Tomasi是Harris的改进版。它直接取矩阵M的两个特征值λ1、λ2中的较小值作为角点响应:

R = min(λ1, λ2)

如果这个最小值大于阈值,就认为是角点。说白了,它比Harris更“挑剔”,但效果往往更好。

核心区别:Harris用行列式和迹的组合,Shi-Tomasi直接用最小特征值。实践中,Shi-Tomasi的角点更均匀,不容易扎堆。

我曾经在视觉伺服项目中对比过两者。Harris能找到更多角点,但很多是“伪角点”;Shi-Tomasi虽然数量少,但每个都很可靠。嗯,这里要注意:如果你的场景纹理丰富,用Shi-Tomasi;如果纹理稀疏,Harris可能更合适。

3.2 SIFT特征:尺度不变性的王者

SIFT(Scale-Invariant Feature Transform)是特征提取界的“老大哥”。它最大的本事是对尺度变化不敏感。你想想看,一个物体离得远和离得近,在图像里大小完全不同,普通角点检测就失效了。SIFT却能搞定。

3.2.1 尺度空间构建

SIFT首先构建高斯金字塔,用不同尺度的高斯核卷积图像:

L(x,y,σ) = G(x,y,σ) * I(x,y)

然后做差分高斯(DoG),找到尺度空间中的极值点。这些极值点就是候选特征点。

3.2.2 关键点定位与方向分配

找到候选点后,还要剔除低对比度的点和边缘响应点。这一步很关键,我见过不少同学直接拿所有极值点用,结果匹配时全是噪声。

方向分配则是统计邻域像素的梯度方向,给每个关键点一个主方向。这样旋转不变性就有了。

避坑指南:我曾经在嵌入式平台上跑SIFT,发现它实在太慢了。一帧640×480的图像,提取特征要200多毫秒。如果你做实时视觉伺服,SIFT基本不可用。除非你用GPU加速。

3.3 ORB特征:速度与精度的平衡

ORB(Oriented FAST and Rotated BRIEF)是2011年提出的,它把FAST角点检测和BRIEF描述子结合起来,并加入了旋转不变性。说白了,就是又快又够用

3.3.1 FAST角点检测

FAST的思路很暴力:一个像素点,如果它周围一圈有连续N个像素都比它亮或都比它暗,那它就是角点。N通常取12或9。

// 伪代码示意
for each pixel p:
    if 连续12个像素亮度 > I(p) + t:
        标记为角点

FAST的优点是极快,缺点是没有尺度不变性,而且容易扎堆。ORB用图像金字塔解决了尺度问题,用灰度质心法计算了方向。

3.3.2 rBRIEF描述子

BRIEF描述子本质上是比较像素对之间的亮度关系,生成一个二进制串。ORB改进了它,加入了旋转和方差分析,称为rBRIEF。

我建议你在做视觉伺服时优先考虑ORB。为什么?因为它的计算量小,匹配速度快,而且精度对于大多数伺服任务已经足够。我在一个抓取项目中用过ORB,在30fps的相机下,特征提取加匹配总共不到10毫秒。

算法 尺度不变 旋转不变 速度(参考) 适用场景
Harris 极快 简单场景、标定
Shi-Tomasi 跟踪、光流
SIFT 离线重建、高精度
ORB 是(金字塔) 实时伺服、SLAM

3.4 特征描述子:让特征点“有身份”

光找到角点还不够,你得给每个角点一个“身份证”,这样在不同图像里才能认出它。这个身份证就是特征描述子

3.4.1 描述子的本质

描述子是一个向量,它编码了特征点周围区域的图像信息。好的描述子应该具备:

  • 可重复性:同一物理点在多张图像中描述子相似
  • 独特性:不同点的描述子差异大
  • 鲁棒性:对光照、噪声不敏感

3.4.2 常见描述子对比

SIFT描述子是128维浮点向量,用梯度直方图统计。ORB描述子是二进制串,用汉明距离匹配。前者精度高,后者速度快。

我个人习惯:如果做视觉伺服,优先用二进制描述子。因为伺服控制需要实时性,汉明距离可以用位运算加速,比欧氏距离快一个数量级。

小技巧:匹配时不要只用最近邻。我一般用最近邻与次近邻的比值法,阈值设0.7左右。这样可以剔除大量误匹配。

3.5 知识体系总览

下面这张图是我自己整理的,把本章的核心逻辑串起来了。你可以看到,从角点检测到描述子,再到匹配,是一条完整的技术链。

图像特征提取核心逻辑 输入图像 角点检测 Harris(响应值R) | Shi-Tomasi(最小特征值) | FAST(像素比较) 特征点优化 非极大值抑制 | 尺度空间极值 | 方向分配 特征描述子 SIFT(128维浮点) | ORB(二进制串) | BRIEF(像素对比较) 特征匹配 → 视觉伺服

从图中你可以看到,整个流程是串行的:输入图像 → 角点检测 → 优化 → 描述子 → 匹配。每一步都有多种选择,具体用哪个,取决于你的应用场景和硬件条件。

总结一下:做视觉伺服,我推荐你用ORB特征。它速度快、有旋转不变性、用金字塔实现尺度不变,而且二进制描述子匹配效率高。如果你追求极致精度且不差算力,SIFT仍然是标杆。

好了,这一章的内容就到这里。特征提取是视觉伺服的基础,基础不牢,地动山摇。希望你能动手写写代码,把Harris、Shi-Tomasi、ORB都跑一遍,感受一下它们的差异。


公众号:蓝海资料掘金营,微信deep3321