2. 重投影误差:标定精度的“照妖镜”
聊标定验证,绕不开一个核心指标——重投影误差。
我个人习惯把它叫作“照妖镜”。你标定做得好不好,参数对不对,它一眼就能看出来。说白了,这个值就是衡量你标定结果到底有多“准”的硬指标。
2.1 重投影误差到底是什么?
先别急着看公式。我讲个场景你就懂了。
你拍了一张标定板照片,提取了上面的角点。比如左上角那个点,在图像上的像素坐标是 (u, v)。然后你用标定出来的相机参数,把这个点从世界坐标系投影到图像平面上,得到一个理论上的像素坐标 (u', v')。
好,现在问题来了:(u, v) 和 (u', v') 是同一个点吗?
理论上应该是。但实际中,因为标定参数有误差、镜头畸变模型不完美、角点提取有噪声……这两个点肯定不重合。它们之间的距离,就是重投影误差。
核心定义:重投影误差 = 实际图像角点与理论投影点之间的像素距离。
单位:像素(pixel)。
理想值:0(永远达不到,但越接近越好)。
嗯,这里要注意:重投影误差不是“误差有多大”,而是“误差有多小”。你想想看,如果标定参数完美,投影点应该和实际点完全重合。不重合的部分,就是标定没做好的部分。
2.2 计算方法:一步步拆解
公式其实不复杂。我直接给你拆成三步走:
- 提取实际角点:从标定板图像中,用亚像素精度提取出所有角点的像素坐标 (u, v)。
- 计算理论投影点:用当前标定得到的相机内参、外参、畸变系数,把标定板上的世界坐标点 (X, Y, Z) 投影到图像平面,得到 (u', v')。
- 计算距离:对每个角点,计算欧氏距离:
error = sqrt( (u - u')² + (v - v')² )
然后,把所有角点的误差取平均,就得到了平均重投影误差。HALCON 里通常报告的就是这个平均值。
我的经验:平均重投影误差 < 0.5 像素,算不错。< 0.3 像素,算优秀。如果超过 1.0 像素,我建议你重新检查标定流程——大概率哪里出了问题。
2.3 在 HALCON 中的获取方式
HALCON 把这步做得非常方便。你不需要自己写公式,它已经封装好了。
最常用的方式有两种:
方式一:标定完成后直接获取
当你用 find_calib_object 提取角点,再用 calibrate_cameras 完成标定后,HALCON 会自动计算每个图像、每个角点的重投影误差。你只需要调用:
* 获取所有标定图像的重投影误差
get_calib_data_observ_contours (Errors, CalibDataID, 'camera', 0, 'all', 'all', 'calib_obj_contours')
* 或者直接获取误差值
get_calib_data (CalibDataID, 'camera', 0, 'all', 'extrinsic_params', ExtrinsicParams)
* 更直接的方式——获取平均误差
get_calib_data (CalibDataID, 'camera', 0, 'all', 'errors', Errors)
我个人更推荐第二种方式。它返回的是一个元组,每个元素对应一张标定图像的平均重投影误差。你可以直接看最大值和平均值。
方式二:可视化查看
HALCON 的标定助手(Calibration Assistant)里,完成标定后会自动显示一个误差分布图。你可以直观地看到:
- 哪些图像的误差偏大
- 误差在图像上的分布是否均匀
- 有没有明显的离群点
我曾经遇到过一个项目,标定完一看,平均误差 0.4 像素,还行。但仔细看分布图,发现左上角区域的误差普遍偏大。后来排查发现,是标定板摆放时左上角区域有点反光,角点提取不准。这就是可视化带来的好处——光看平均值会骗人。
避坑指南:千万不要只看平均重投影误差!
我曾经吃过这个亏。平均误差 0.3 像素,觉得稳了。结果实际测量时偏差很大。后来一查,发现有一张图像的误差高达 2.5 像素,但其他图像误差很小,把平均值拉低了。所以,我现在的习惯是:
- 看平均误差
- 看最大误差
- 看误差分布图
- 三个都过了,才算真的过
2.4 重投影误差的“潜规则”
这里有几个点,新手容易忽略:
| 误区 | 真相 |
|---|---|
| 误差越小越好,0.1 像素最好 | 不一定。误差太小可能意味着过拟合,或者标定板图像太少、太单一 |
| 所有图像误差必须一致 | 不需要。不同角度、不同位置的图像,误差天然会有差异 |
| 重投影误差 = 测量精度 | 错!重投影误差只反映标定参数的自洽性,不代表实际测量精度 |
| 误差大就一定是标定问题 | 不一定。也可能是标定板不平、图像模糊、光照变化导致的角点提取偏差 |
嗯,这里我要特别强调第三点。重投影误差是“内检”,不是“外检”。它只能告诉你标定参数在数学上是否自洽,不能直接告诉你实际测量时能到多少精度。要验证实际精度,还得靠后面的章节——比如用标准件做实测验证。
2.5 知识结构图
下面这张图,帮你把重投影误差的来龙去脉理清楚:
2.6 小结
重投影误差是标定验证的第一步,也是最基础的一步。它告诉你标定参数在数学上是否自洽。但记住:它只是一个“内检”指标,不是最终测量精度的保证。
我个人的工作流是:先看平均重投影误差,再看最大误差,最后看误差分布图。三个都过了,才敢说标定参数基本没问题。至于实际精度到底行不行,那是后面章节要聊的事。