一句话定义
单应矩阵 H 描述同一平面在两幅图间的 3×3 投影关系,RANSAC 用「随机抽最小样本集 → 拟合模型 → 数内点」的循环,从充满外点的匹配中稳健地估计出 H。
为什么重要
特征匹配的输出永远混着外点,直接最小二乘会被少数错误配对彻底带偏;RANSAC 是计算机视觉中使用频率最高的稳健估计框架——拼接、标定、基础矩阵、跟踪初始化都在用,「先 RANSAC 再精化」是几何估计的标准姿势。
直观类比
在一屋子人对答案里找共识:每次随机请 4 个人(4 对点)拟出一套方案 H,然后让全屋人投票(重投影误差小于阈值算赞成);反复抽若干轮,得票最多的方案就是真共识,投票者即内点集,最后再让所有内点重新精修一次方案。
前置知识
kp-008(带外点的匹配集合);kp-004(单应变换与齐次坐标)。
核心概念
- 单应(Homography):平面到平面的投影映射,8 个有效自由度,尺度任意。
- 最小样本集(s):确定模型所需最少点对,单应为 4 对(每对贡献 2 个方程)。
- 内点/外点(Inlier/Outlier):重投影误差小于阈值 ε 的匹配为内点。
- RANSAC 循环:抽样 → 求模型 → 统计内点 → 保留最大内点集。
- 迭代次数 N:由内点率 w、样本数 s、期望置信度 p 计算。
- 精化(Refinement):用全部内点做最小二乘重估模型。
原理与机制
匹配集里正确匹配满足同一几何关系(同一平面的单应),错误匹配分布随机;最小二乘对平方误差敏感,一个外点即可摧毁解,而 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)₃) ‖² < ε²图示
实例与案例
全景拼接:两图 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))常见误区
- 阈值 ε 拍脑袋:ε 应与特征定位精度同量级(1–3 像素),过松把错误匹配算内点,过紧毁掉低纹理场景。
- 外点率极高时还硬跑:w 低于约 0.3 时迭代次数爆炸,应先加强匹配过滤(ratio、互最近邻、网格运动统计 GMS)。
- 把 RANSAC 当终点:得到最大内点集后必须用全部内点最小二乘重估,否则精度被单轮随机性限制。
- 误用单应处理非平面/纯旋转场景:相机纯绕光心旋转时任意场景满足单应,普通视差场景则必须用基础矩阵(kp-012)。
与其他知识点的关系
kp-011 标定、kp-012 基础矩阵估计都以 RANSAC 为稳健层;kp-014 SFM 的两视图初始化同样由「匹配 + RANSAC + 本质矩阵」完成。
自测题
- 估计单应为什么恰好需要 4 对点?
答案要点:H 有 8 个自由度,每对点提供 2 个独立方程,4 对共 8 个方程恰可解。
- 内点率 50%、s=4、p=0.99,N 大约多少?
答案要点:w^s = 1/16,N = log(0.01)/log(15/16) ≈ 72 轮。
- 为什么 RANSAC 比「先最小二乘再剔除大残差」更稳健?
答案要点:最小二乘的初解本身可能被外点污染到无意义,剔残差的判断随之失效;RANSAC 从不依赖初解,目标函数直接是内点计数。
延伸阅读
- Fischler 与 Bolles 1981《Random Sample Consensus》
- Hartley 与 Zisserman《Multiple View Geometry in Computer Vision》第 4 章