DYING4EVER

NOTES

第11章_特征点检测与匹配

第 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 无检测器匹配 适合低纹理 计算成本较高