第三章:图像特征提取——角点检测与特征描述子
各位同学,欢迎来到视觉伺服控制的核心环节。图像特征提取,说白了就是让机器人“看懂”画面里的关键信息。你想想看,如果机器人看每一帧图像都像看一张白纸,那它根本没法定位、没法跟踪。所以,这一章我们聊聊角点检测、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大于阈值,就是角点。
3.1.2 Shi-Tomasi角点检测
Shi-Tomasi是Harris的改进版。它直接取矩阵M的两个特征值λ1、λ2中的较小值作为角点响应:
R = min(λ1, λ2)
如果这个最小值大于阈值,就认为是角点。说白了,它比Harris更“挑剔”,但效果往往更好。
我曾经在视觉伺服项目中对比过两者。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 关键点定位与方向分配
找到候选点后,还要剔除低对比度的点和边缘响应点。这一步很关键,我见过不少同学直接拿所有极值点用,结果匹配时全是噪声。
方向分配则是统计邻域像素的梯度方向,给每个关键点一个主方向。这样旋转不变性就有了。
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描述子是二进制串,用汉明距离匹配。前者精度高,后者速度快。
我个人习惯:如果做视觉伺服,优先用二进制描述子。因为伺服控制需要实时性,汉明距离可以用位运算加速,比欧氏距离快一个数量级。
3.5 知识体系总览
下面这张图是我自己整理的,把本章的核心逻辑串起来了。你可以看到,从角点检测到描述子,再到匹配,是一条完整的技术链。
从图中你可以看到,整个流程是串行的:输入图像 → 角点检测 → 优化 → 描述子 → 匹配。每一步都有多种选择,具体用哪个,取决于你的应用场景和硬件条件。
好了,这一章的内容就到这里。特征提取是视觉伺服的基础,基础不牢,地动山摇。希望你能动手写写代码,把Harris、Shi-Tomasi、ORB都跑一遍,感受一下它们的差异。
公众号:蓝海资料掘金营,微信deep3321