看懂标定结果:重投影误差、参数不确定度与覆盖率
重投影误差低并不等于标定准确。本文解释 RMS 的定义与局限,如何阅读参数标准差与相关性、投影不确定度图、覆盖率和逐图误差,如何用独立数据验证,并给出工业相机常见结果的经验量级与注意事项。
要点
- RMS 重投影误差衡量的是模型对“参与标定的点”的拟合程度,是必要条件,不是充分条件。
- 覆盖不足时,RMS 可以很低,画面边角的实际误差却很大。
- 参数标准差和相关系数说明哪些参数被数据约束住了、哪些没有;换算成像素影响更直观。
- 投影不确定度图和覆盖图能直接指出“哪里还需要补拍”。
- 逐图误差用于发现问题图像,残差的分布规律能揭示模型不足或标定板变形。
- 最后一定要用未参与标定的数据做独立验证。
重投影误差是怎么算的?
对每个检测到的特征点,用标定得到的内参、畸变和这张图的位姿,把它的三维坐标投影回图像,与检测位置相减,得到残差向量 (du, dv)。RMS 重投影误差是所有点残差长度的均方根:
RMS = sqrt( Σ(du² + dv²) / N ),N 为点数。
OpenCV 的 calibrateCamera 返回的就是这个值。有些软件按坐标分量统计,分母是 2N,数值会小 √2 倍。比较不同软件的结果之前,先确认定义是否一致。
RMS 由两部分组成:一是特征检测的随机误差,与图像噪声、模糊、对比度和特征大小有关;二是模型无法解释的系统误差,例如模型不够用、标定板不平或尺寸不准。
为什么 RMS 低不代表标定好?
RMS 本质上是“训练误差”。以下情况都会让 RMS 很低,结果却不可靠:
- 覆盖不足:特征点集中在画面中央,边缘的畸变全靠外推,边角误差可达数个像素;
- 姿态单一:标定板几乎都正对相机,焦距与距离相互抵消,焦距可能偏差很大;
- 图像或点太少:约束不够,模型“刚好”能拟合这些点;
- 参数过多:高阶模型把噪声也拟合了进去,也就是过拟合;
- 过度删图:为了压低 RMS 删掉误差大的图像,删掉的往往正是边角和大倾角的图;
- 共性的系统误差:方格尺寸填错时 RMS 完全不受影响;标定板平滑的翘曲也会被畸变参数部分吸收。
反过来,RMS 稍高也不一定是坏事。如果图像噪声较大,但点数多、覆盖好,参数仍然可以被很好地确定。
参数标准差:哪些参数被“钉住”了?
优化收敛后,可以由雅可比矩阵和残差估计参数的协方差矩阵 C,对角线元素开方就是各参数的标准差(1σ)。OpenCV 的 calibrateCameraExtended 会返回内参的标准差,BDB 相机标定工作台也会给出每个参数的标准差。
标准差的绝对数字不直观,建议换算成像素影响:
- 焦距:fx 有偏差 Δfx 时,距主点 (u − cx) 处的投影变化约为
Δfx × (u − cx) / fx。例如 fx = 2000 px、σ(fx) = 1 px,在距主点 1000 px 的位置约为 0.5 px。 - 径向畸变:k1 有偏差 Δk1 时,投影变化约为
Δk1 × r² × (u − cx),r 为归一化半径。在画面角落,若 r² ≈ 0.64、u − cx = 1000 px,Δk1 = 0.001 就对应约 0.64 px。
需要注意,这里的标准差是在“模型正确、误差随机且相互独立”的假设下得到的,只反映随机误差,真实误差通常不会比它小。可以把它看作误差的下限。
用真值已知的合成图像可以直观地体会这一点。在用 OpenCV 做相机标定一文的示例中,20 张合成图像标定得到的焦距和主点标准差约为 0.5 px,它们的估计值与真值之差约在 0.1–0.5 px 之间,与标准差处于同一量级。实拍时还会叠加标定板制造误差、模型误差等系统因素,实际偏差往往更大。
多相机标定时,外参同样有不确定度。BDB 相机标定工作台会给出各相机相对参考相机的旋转(以度计)和平移的标准差;双目测距应用尤其要关注基线方向平移的标准差,它会按比例传递到测距结果中。
参数相关性:哪些参数在互相抵消?
把协方差矩阵归一化,得到相关系数 ρ_ij = C_ij / sqrt(C_ii × C_jj)。|ρ| 接近 1,说明两个参数可以互相补偿:一个变大、另一个跟着变,投影结果几乎不变。常见的强相关组合有:
- k1、k2、k3 等各阶径向畸变系数之间;
- fx 与 fy;
- 主点与切向畸变(cx 与 p2、cy 与 p1);
- 焦距与标定板的距离,缺少倾斜姿态时尤其明显;
- 大视场模型中的部分参数,例如双球模型的 fx 与 ξ。
强相关本身不一定意味着投影不准,但说明单个参数的数值不可信:两次标定得到的 k3 可能差别很大,整体投影却几乎一样。改善办法是增加姿态和覆盖的多样性,固定数据约束不住的参数(如 k3 或切向畸变),或者换用更简单的模型。
投影不确定度图
参数的不确定度最终体现在“某个方向的光线会投影到哪个像素”上。把参数协方差传播到图像上的每一个位置,就得到投影不确定度图:
Σ_uv = J × C × Jᵀ
其中 J 是投影坐标对内参的偏导数。把各位置的不确定度画成热力图,典型情况是:数据覆盖充分的中央区域很小,向数据稀疏的边角迅速增大。它直接告诉你哪里需要补拍,比逐个查看参数标准差更直观。严格计算时还要考虑内参与各图位姿之间的耦合,粗略评估时可以只看内参部分。
覆盖率
把所有图像中检测到的特征点叠加到一张与图像同尺寸的画布上,就能看出数据覆盖了哪些区域。也可以把图像划分成网格(例如 10×10),统计含有特征点的格子所占比例,并特别关注四角和边缘的格子。
理想情况是:特征点一直铺到图像边缘附近,而且边角区域由多张倾斜方向不同的图像共同覆盖。
逐图误差与离群点
逐图 RMS 用来发现有问题的图像。某张图的误差明显高于其他图(例如超过中位数的 2–3 倍,经验值)时,先查明原因:
- 运动模糊、离焦、过曝或反光;
- 特征点误检,或 ChArUco 标记识别错误导致角点编号错位;
- 卷帘快门相机拍摄了运动中的标定板;
- 拍摄时标定板被弯曲或局部遮挡。
查明原因后再决定是否剔除。BDB 相机标定工作台在优化中使用 Huber 鲁棒核并自动剔除离群点,但这不能替代人工检查。
把残差向量画出来也很有用:
- 随机、无规律:正常;
- 在图像坐标中呈径向或旋涡状规律:相机模型不够,考虑增加畸变参数或换模型;
- 在标定板坐标中,各图出现相同的规律:标定板本身不平,或者图案位置有误差。
拿到一份标定结果,按什么顺序看?
- 检测情况:每张图检测到多少个点,哪些图检测失败,失败原因是什么。
- 覆盖图:四角和边缘是否有足够的特征点。覆盖不足时,后面的指标再好看也要补拍。
- 总 RMS 与逐图 RMS:总体量级是否合理,有没有明显偏高的图像。
- 残差分布:有没有径向、旋涡状或在标定板坐标中重复出现的规律。
- 参数是否合理:fx 应接近“镜头焦距 / 像元尺寸”的估算值;fx 与 fy 之比应接近 1;主点一般在图像中心附近;畸变的方向应与镜头一致,例如广角镜头常见的桶形畸变对应 k1 为负。明显不合常理的数值,往往说明参数填错或数据退化。
- 标准差与相关性:关键参数的标准差换算成像素影响后是否足够小,有没有接近 ±1 的相关系数。
- 投影不确定度:画面边角是否仍在可接受范围内。
- 独立验证:用未参与标定的数据检验,见下文。
前几步发现问题时,应先回头改进采集,而不是在后面的指标上反复调参。
“好结果”大致是什么样?
下面的数字只是常见量级(经验值),用于发现明显异常,不是验收标准。实际值受像元尺寸、噪声、模糊、标定板质量、特征类型和模型选择的影响很大:
| 指标 | 常见量级 | 说明 |
|---|---|---|
| RMS(工业相机、高质量标定板、成像良好) | 约 0.05–0.2 px | 角点类特征,按点的残差长度统计 |
| RMS 在 0.3–0.5 px | 可用,但值得排查 | 检查模糊、照明、标定板平面度和模型 |
| RMS 超过 1 px | 通常存在明显问题 | 误检、运动模糊、模型错误或参数填错 |
| 留出验证误差 | 接近训练 RMS | 明显偏大说明过拟合或覆盖不足 |
| 投影不确定度 | 小于应用允许的误差 | 重点看画面边角 |
合成图像的 RMS 会远低于实拍,不能拿来作为实拍的参照。
怎样用独立数据验证?
- 留出验证:保留几张不参与标定的图像,固定内参只求位姿,计算它们的重投影误差;
- 已知尺寸:测量一个经过计量的长度,如标准尺或另一块已检定的标定板,放在画面不同位置检验;
- 直线检验:去畸变后,物理上的直线在图像中应保持笔直;
- 双目检验:极线校正后,同名点的纵坐标之差应接近 0。
验证通过后,把标定结果、验证方法和数据一起归档,方便日后对比复检。