用最小二乘拟合一组二维点,本来该是一条漂亮的直线,结果数据里混进三五个离谱的野点,拟合出来的线直接被带偏。遇到这种数据,RANSAC 就是救场的办法,中文一般叫随机抽样一致算法。
它的思路很直白:模型对不对,让数据自己投票。名字里的随机指抽样这一步,一致指内点数量达到一致认可。它不挑模型类型,直线、平面、单应矩阵、相机位姿都能套,只要能算出点到模型的距离就有戏。
核心步骤就四步
- 随机抽最小样本集,拟合直线就抽 2 个点
- 用这组样本算出一个候选模型
- 拿全部点套这个模型,距离小于阈值的算内点,数一下个数
- 重复几百上千次,留下内点最多的那个模型
最后再用全部内点补一次最小二乘,把模型磨细。因为评分看内点数量而不是误差平方和,几个野点再离谱也翻不了盘。
工程里怎么调参
关键是距离阈值,按数据噪声定,点云配准里常用 1 到 3 个单位。迭代次数和内点比例挂钩,内点越少要迭代越多,有经典估算公式靠内点比例和期望成功率算,工程上多数直接给个足够大的数,再用超时兜底。OpenCV 里匹配特征点算单应矩阵,直接选 RANSAC 模式:
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)返回的 mask 里为 0 的就是被判定成外点的匹配,直接丢掉,顺手统计一下内点比例,比例太低说明场景不适合直接匹配,先回去检查特征提取。SIFT 匹配去误配、消失点估计,背后基本都是这一套。
点云处理里它更是标配:两帧点云先粗配对,再用 RANSAC 剔掉错误对应关系,最后送进精配准。PCL 库把常见模型都封装好了,平面、直线、圆柱、球,换个模型类型就能拟合,工业件的平面提取天天在用。
什么时候别用它
数据本来就干净,最小二乘更快更稳。它还有随机性,同一批数据跑两次结果可能不同,要稳定就把迭代次数调大。野点占一半以上时它也吃力,一般先滤波或降采样,再上 RANSAC。选模型类型前先想清楚数据的几何形状,点云里硬拟直线,出来的结果一般没法看。