相机校准:如何正确进行

6
我正在尝试使用检查板通过Matlab和OpenCV提供的著名的张氏方法进行相机校准,随后进行束调整。有许多经验指南,但根据我的个人经验,精度相当随机。它有时可能非常好,但有时也可能非常差。实际上,仅仅通过将检查板放置在不同位置,结果就可能会有很大的变化。假设目标相机是矩形的,水平FOV为110度。
以下是需要回答的问题:
1. 检查板中的方块数量是否会影响精度?张氏在他的原始论文中使用了8x8的方块,但并没有真正解释为什么。 2. 方块的长度是否会影响精度?张氏使用了17cm x 17cm的方块,但并没有真正解释为什么。 3. 不同检查板位置/方向的拍摄快照的最佳数量是多少?张氏仅使用了5张图像。我看到有人建议使用20~30张图像,并在各个角度、填充整个视野、向左、向右、向上和向下倾斜的检查板上进行拍摄,并建议不应该将检查板放置在类似的位置/方向,否则结果将对该位置/方向有偏差。这是正确的吗?
目标是找出一种工作流程,以获得一致的校准结果。
2个回答

6
如果您获得的准确度“相当随机”,那么您可能做得不对:通过稳定的光学和良好的操作程序,您应该始终获得几个像素的RMS投影误差。当然,这是否对应于在3D空间中的毫米或米的差异取决于您的光学和传感器分辨率(校准不能解决物理问题)。
我之前在这个答案中写了一些建议,并建议您按照它们去做。特别是要注意锁定焦距(我见过和听说过许多人试图在自动对焦下进行相机校准并且非常失望)。至于目标大小,再次取决于您的光学和相机分辨率,但通常来说,目标是(1)用测量填满视野和您将要使用的空间体积,(2)观察到重要的透视缩短,因为这就是约束FOV解决方案的内容。祝好运!
[Ed. 相关评论]
关于连续校准中参数值的变化,我会首先计算交叉RMS误差,即在数据集1上使用校准在数据集2上的相机进行的RMS误差,反之亦然。如果任何一个比校准误差显著高,则表示相机在两次校准之间发生了变化,因此所有可能性都会被排除。您是否启用自动{对焦、光圈、变焦、稳定}功能?将它们全部关闭:自动任何内容都是校准的祸根,唯一的例外是曝光时间。否则,您需要确定观察到的参数变化是否真正有意义(提示,它们通常没有)。像素焦距的几千分之几的变化可能与今天的传感器分辨率无关-您可以通过将其表示为毫米并与传感器的点距进行比较来验证。此外,主点位置的十多个像素的变化很常见,因为它很难被观察到,除非您的校准过程非常小心地设计以估计它。

我可以拿到20张棋盘图像,并得到一组参数的组合,包括焦点、主点和畸变参数,这些参数在给定的棋盘图像中具有较低的RMS投影误差。问题是,如果我再拿另外20张棋盘图像,我会得到仍然具有较低的RMS投影误差的参数,但与之前确定的参数可能会有很大的差异。问题是如何知道哪组参数是正确的?有什么正确的工作流程可以保证一致的结果? - user3667089

3
理想情况下,您希望将检查板放置在距离相机大致相同的距离处,就像您要进行测量的距离一样。因此,您的棋盘格必须足够大,以便从该距离分辨率可达。您还需要使用点覆盖整个视野,特别是靠近帧的边缘和角落。此外,棋盘越小,您需要拍摄的图像数量就越多,以覆盖整个视野。因此,20-30张图像通常是一个好的经验法则。
另一件事是检查板应该是不对称的。理想情况下,您希望一侧有偶数个正方形,另一侧有奇数个正方形。这样,棋盘的平面方向是明确的。
此外,我建议您尝试MATLAB中的Camera Calibrator app。至少,请查看文档,其中有许多有用的摄像机校准建议。

1
我要测量的距离不仅限于一个小区域。它可能大约在2米到50米之间。您能否详细说明一下数学方面,为什么“理想情况下,您希望将棋盘放置在与您要进行测量的距离大致相同的距离处,作为摄像机的距离。”?我认为距离不应该有影响。另外感谢您的建议。 - user3667089
3
理论上,距离并不重要。但实际上,由于噪音、量化误差、舍入误差等问题,你需要在尽可能接近测量位置的地方进行校准。 - Dima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接