如何分析cv::calibrateCamera返回结果 其rms与totalAvgErr有何关系
OpenCV cv::calibrateCamera返回结果分析与重投影误差相关问题解答
1. rms与totalAvgErr的关联
你测试得到二者返回结果基本一致是正常现象,二者核心计算逻辑完全对齐:
二者均是将标定板三维世界坐标点,通过标定得到的相机内参、畸变系数、每张图对应的外参(旋转向量rvecs、平移向量tvecs)投影到二维图像平面,计算投影点与实际检测到的角点坐标的L2距离的均方根值。
默认使用普通针孔相机模型、无特殊标定flag的场景下,cv::calibrateCamera内部计算返回的rms,和示例中computeReprojectionErrors返回的totalAvgErr数值误差可以忽略,本质是同一个统计值。
2. 为什么需要额外执行computeReprojectionErrors函数
额外调用该函数主要是为了补充cv::calibrateCamera原生不具备的能力:
- 获取单张标定图的独立误差:
computeReprojectionErrors提供了perViewErrors输出参数,可以得到每一张标定图片对应的单独重投影误差。这个参数是cv::calibrateCamera原生不会返回的,你可以通过这个值定位误差异常的标定图:比如某张图的误差是其他图的3倍以上,大概率是这张图拍摄时标定板晃动、角点检测出错,直接剔除该图后重新标定可以大幅提升最终标定精度。 - 兼容特殊相机模型:示例代码中已经预留了鱼眼模型的分支,如果是使用鱼眼相机、广角相机等非普通针孔模型的标定场景,
cv::calibrateCamera默认返回的rms是基于针孔模型计算的,和你实际使用的模型不匹配,需要自己替换投影函数计算符合当前模型的重投影误差。 - 支持自定义误差校验逻辑:你可以基于该函数的框架做自定义修改,比如分图像区域统计边缘和中心的重投影误差、过滤离群角点的误差、计算不同距离下的标定误差等,满足定制化的精度校验需求。
3. cv::calibrateCamera返回结果的分析方法
你可以按以下顺序判断标定结果是否合格:
- 先看返回的
rms数值是否合理:常规1080P分辨率的普通工业相机,合格的标定结果rms通常在0.1~1像素区间,如果超过1像素首先排查标定板打印质量、角点检测是否有错误、拍摄的标定图姿态覆盖是否足够。 - 校验内参与畸变系数合理性:内参矩阵中
fx和fy数值应该接近(除非你用的是非正方形像素的特殊传感器),主点cx、cy应该接近图像的中心坐标,畸变系数数值不会出现异常过大的情况。 - 结合单张图误差过滤坏图:跑完
computeReprojectionErrors后检查perViewErrors,剔除误差明显高于平均水平的标定图后重新执行标定,直到所有图片的单图误差都在合理区间内。
内容的提问来源于stack exchange,提问作者wsy00
相关产品推荐
相关产品推荐

