第 11 章 特征点检测与匹配
本章概括
本章整理局部特征点检测和匹配方法,包括 Harris 角点、SIFT、SURF、ORB,以及 SuperGlue 和 LoFTR 等学习式匹配方法。重点是理解“检测点、描述点、匹配描述子”的完整流程。
解决方案
特征点匹配的基本流程是:检测稳定关键点,计算局部描述子,利用距离度量匹配描述子,再通过几何约束去除错误匹配。它常用于图像拼接、三维重建、目标定位和视觉 SLAM。
Harris 角点检测
Harris 角点基于局部窗口灰度变化。若窗口向任意方向移动都会产生明显灰度变化,则该点可能是角点。
结构张量为:
$$ M= \begin{bmatrix} \sum I_x^2 & \sum I_xI_y\ \sum I_xI_y & \sum I_y^2 \end{bmatrix} $$
其中 $I_x,I_y$ 是图像梯度。Harris 响应为:
$$ R=\det(M)-k[\operatorname{trace}(M)]^2 $$
$R$ 大且为正时通常表示角点,$k$ 常取 $0.04$ 到 $0.06$。
Harris 代码整理
这段代码用于检测 Harris 角点并在原图上标红。
import cv2
import numpy as np
image = cv2.imread("input.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)
dst = cv2.dilate(dst, None)
image[dst > 0.01 * dst.max()] = [0, 0, 255]
blockSize 是角点检测邻域大小,越大越平滑但定位更粗;ksize 是 Sobel 梯度窗口大小,通常为奇数;k 控制角点响应敏感度;阈值 0.01 * dst.max() 越大,保留角点越少。
SIFT 特征点检测
SIFT 在尺度空间中检测极值点,对尺度和旋转变化较稳定。主要步骤包括尺度空间构建、DoG 极值检测、关键点定位、方向分配和描述子生成。
DoG 可近似 LoG:
$$ D(x,y,\sigma)=L(x,y,k\sigma)-L(x,y,\sigma) $$
其中 $L(x,y,\sigma)=G(x,y,\sigma)*I(x,y)$ 是高斯尺度空间图像。DoG 极值点用于候选关键点检测。
SIFT 代码整理
import cv2
image = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)
sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(image, None)
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None)
detectAndCompute() 同时输出关键点和描述子。nfeatures 可限制特征点数量;contrastThreshold 越大,低对比度点越容易被过滤;edgeThreshold 越大,被过滤的边缘响应越少,特征点可能更多。
SURF
SURF 使用 Hessian 矩阵近似和积分图加速,速度通常快于 SIFT。它同样具有尺度和旋转鲁棒性,但在 OpenCV 中常位于 xfeatures2d 扩展模块。
import cv2
image = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)
surf = cv2.xfeatures2d.SURF_create(400)
keypoints, descriptors = surf.detectAndCompute(image, None)
参数 400 是 Hessian 阈值,阈值越大检测到的特征点越少但更稳定。
ORB
ORB 结合 FAST 关键点和 BRIEF 描述子,并加入方向信息。它速度快、描述子为二进制,适合实时应用。
import cv2
image = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)
orb = cv2.ORB_create(nfeatures=500)
keypoints, descriptors = orb.detectAndCompute(image, None)
nfeatures 控制保留的关键点数量。ORB 描述子常用 Hamming 距离匹配,速度快但在强尺度变化下通常不如 SIFT 稳定。
特征匹配
描述子匹配常使用暴力匹配 BFMatcher 或 FLANN。SIFT/SURF 这类浮点描述子常用欧氏距离,ORB 二进制描述子常用 Hamming 距离。
常用错误匹配过滤方法:
- Lowe ratio test:最近邻距离明显小于次近邻距离时保留。
- RANSAC:利用单应矩阵或基础矩阵剔除几何不一致匹配。
SuperGlue
SuperGlue 使用图神经网络和注意力机制在特征点之间建立上下文关系,可显著提升复杂场景下的匹配质量。它不是只比较局部描述子,而是联合考虑两幅图中的关键点集合。
LoFTR
LoFTR 是 detector-free 方法,不先显式检测关键点,而是在 Transformer 特征上直接建立密集匹配关系。它适合低纹理或重复纹理场景,但计算量通常高于传统局部特征方法。
几种方法对比
| 方法 | 特点 | 优点 | 局限 |
|---|---|---|---|
| Harris | 基于角点响应 | 简单、定位较准 | 不具备尺度不变性 |
| SIFT | 尺度空间 + 描述子 | 稳定、鲁棒 | 速度较慢 |
| SURF | Hessian + 积分图 | 比 SIFT 快 | 扩展模块依赖较强 |
| ORB | FAST + BRIEF | 快、适合实时 | 尺度/光照鲁棒性较弱 |
| SuperGlue | 学习式匹配 | 匹配质量高 | 需要模型推理 |
| LoFTR | 无检测器匹配 | 适合低纹理 | 计算成本较高 |