相机校准:如何正确地进行

时间:2015-06-30 08:26:32

标签: opencv computer-vision camera-calibration calibration

我正在尝试使用棋盘方法,通过众所周知的Zhang方法校准相机,然后进行束调整,Matlab和OpenCV都可以使用。有很多经验指导,但从我个人的经验来看,准确性是相当随机的。它有时可能非常好,但有时也非常糟糕。只需将棋盘放在不同的位置,结果实际上可以变化很大。假设目标摄像机是直线的,具有110度水平视场。

  1. 棋盘格的方格数是否影响准确度?张在他的原始论文中使用8x8而没有真正解释原因。

  2. 方块的长度是否会影响精度?张使用17厘米x 17厘米而没有真正解释原因。

  3. 不同棋盘位置/方向的最佳拍摄数量是多少?张仅使用5张图片。我看到人们建议20到30张带有不同角度的棋盘图像,填满整个视野,向左,向右,向上和向下倾斜,并建议不要将棋盘放置在相似的位置/方向,否则结果将是偏向于那个位置/方向。这是对的吗?

  4. 目标是找出一个工作流程,以获得一致的校准结果。

2 个答案:

答案 0 :(得分:4)

如果您获得的准确度是"非常随机"然后你可能做得不对:有了稳定的光学和良好的传导程序,你应该始终在几十分之一像素内得到RMS投影误差。当然,这对应于3D空间中的毫米或米的变化取决于您的光学和传感器分辨率(校准不是物理学的一种方式)。

我在this answer之前写过一些建议,我建议您按照这些建议。特别要注意锁定焦距(我已经看到并且听过无数人试图在自动对焦上校准相机,并且非常失望)。至于目标的大小,再次取决于你的光学和相机分辨率,但一般来说,目标是(1)填充测量两个视野您将要使用的空间体积,以及(2)观察重要的透视缩短,因为这是限制FOV解决方案的因素。祝好运!

[编辑发表评论]

关于连续校准中参数值的变化,我首先要做的是计算交叉RMS误差,即数据集1上的RMS误差,相机在数据集2上校准,反之亦然。如果其中任何一个明显高于校准误差,则表明相机在两次校准之间已经改变,因此所有可能性都已关闭。你有自动{聚焦,光圈,变焦,稳定}吗?全部关闭:自动任何东西都是校准的祸根,唯一的例外是曝光时间。否则,您需要查看您在参数上观察到的变化是否真正有意义(提示,它们通常不是)。千分之几的像素焦距的变化可能与今天的传感器分辨率无关 - 您可以通过用mm表示它来验证它,并将其与传感器的点间距进行比较。此外,主要点的位置以数十像素的顺序变化是常见的,因为除非您的校准程序非常仔细设计以估计它,否则很难观察到它。

答案 1 :(得分:2)

理想情况下,您希望将棋盘放置在与相机大致相同的距离处,作为您想要进行测量的距离。所以你的棋盘方块必须足够大,以便从那个距离可以解析。您还希望用点覆盖整个视野,尤其是靠近框架的边缘和角落。此外,电路板越小,覆盖整个视野的图像就越多。因此,20-30张图像通常是一个很好的经验法则。

另一件事是棋盘应该是不对称的。理想情况下,您希望在一侧具有偶数个正方形,而在另一侧具有奇数个正方形。这样,电路板的面内方向就是明确的。

另外,我建议您在MATLAB中尝试Camera Calibrator app。至少,请查看文档,其中有许多有用的校准相机的建议。