匹配稳健化:RANSAC 与单应估计

核心02-特征与匹配预计 25 分钟RANSAC单应矩阵图像拼接外点

前置知识点

kp-008 描述子与匹配:从 BRIEF 到 ORB kp-004 几何变换与图像插值

一句话定义

单应矩阵 H 描述同一平面在两幅图间的 3×3 投影关系,RANSAC 用「随机抽最小样本集 → 拟合模型 → 数内点」的循环,从充满外点的匹配中稳健地估计出 H。

为什么重要

特征匹配的输出永远混着外点,直接最小二乘会被少数错误配对彻底带偏;RANSAC 是计算机视觉中使用频率最高的稳健估计框架——拼接、标定、基础矩阵、跟踪初始化都在用,「先 RANSAC 再精化」是几何估计的标准姿势。

直观类比

在一屋子人对答案里找共识:每次随机请 4 个人(4 对点)拟出一套方案 H,然后让全屋人投票(重投影误差小于阈值算赞成);反复抽若干轮,得票最多的方案就是真共识,投票者即内点集,最后再让所有内点重新精修一次方案。

前置知识

kp-008(带外点的匹配集合);kp-004(单应变换与齐次坐标)。

核心概念

原理与机制

匹配集里正确匹配满足同一几何关系(同一平面的单应),错误匹配分布随机;最小二乘对平方误差敏感,一个外点即可摧毁解,而 RANSAC 的目标函数是「内点计数」,对错误样本不敏感。每轮:抽 4 对点,用直接线性变换(DLT)解 H,把所有点代回算重投影误差并计数。随机抽 s 点全为内点的概率是 w^s,因此 N = log(1−p)/log(1−w^s):内点率 60%、s=4、置信度 0.99 时约需 57 轮——RANSAC 的代价随内点率下降指数增长,这是它的使用边界。工程变体 MLESAC、PROSAC(按匹配质量优先抽样)在此基础上加速或加权。

公式与模型

x′ ~ H x (齐次坐标,~ 表示差一个尺度因子) N ≥ log(1 − p) / log(1 − w^s) 内点判定: ‖ x′ − (Hx)/((Hx)₃) ‖² < ε²

图示

蓝点:内点(重投影误差小于阈值,支持模型) 橙点:外点,被丢弃 随机 4 点 → 求单应 → 全量验证 → 取内点最多的 H,再用内点最小二乘精化

实例与案例

全景拼接:两图 ORB 匹配后 findHomography(..., cv2.RANSAC),返回的 mask 直接标出内点/外点,warp 后多图对齐。广告牌替换(AR 贴图):估计牌面单应后把素材 warp 进去。文档透视校正的角点若由特征匹配给出,同样走 RANSAC 防错配。视频防抖中逐帧估计帧间单应,取其刚性分量做补偿。

import cv2
H, mask = cv2.findHomography(pts_src, pts_dst, cv2.RANSAC, ransacReprojThreshold=3.0)
inliers = mask.ravel().astype(bool)     # True 为内点
aligned = cv2.warpPerspective(img_src, H, (w, h))

常见误区

与其他知识点的关系

kp-011 标定、kp-012 基础矩阵估计都以 RANSAC 为稳健层;kp-014 SFM 的两视图初始化同样由「匹配 + RANSAC + 本质矩阵」完成。

自测题

  1. 估计单应为什么恰好需要 4 对点?

答案要点:H 有 8 个自由度,每对点提供 2 个独立方程,4 对共 8 个方程恰可解。

  1. 内点率 50%、s=4、p=0.99,N 大约多少?

答案要点:w^s = 1/16,N = log(0.01)/log(15/16) ≈ 72 轮。

  1. 为什么 RANSAC 比「先最小二乘再剔除大残差」更稳健?

答案要点:最小二乘的初解本身可能被外点污染到无意义,剔残差的判断随之失效;RANSAC 从不依赖初解,目标函数直接是内点计数。

延伸阅读

相关知识点

kp-011 相机标定与畸变kp-012 对极几何:本质矩阵与基本矩阵