Opencv 摄像机校准:如何正确校准

Opencv 摄像机校准:如何正确校准,opencv,computer-vision,camera-calibration,calibration,Opencv,Computer Vision,Camera Calibration,Calibration,我正在尝试使用棋盘来校准相机,使用众所周知的Zhang方法,然后使用捆绑调整,这在Matlab和OpenCV中都可用。有很多经验指导,但从我个人的经验来看,准确性是相当随机的。有时可能真的很好,但有时也很糟糕。只要简单地将棋盘放在不同的位置,结果实际上会有很大的不同。假设目标摄像机是直线的,水平视场为110度 棋盘格中的方块数是否影响精度?张在他的原始论文中使用了8x8,但没有真正解释原因 正方形的长度会影响精度吗?张使用了17cm x 17cm,但没有真正解释原因 不同棋盘位置/方向的最佳快照

我正在尝试使用棋盘来校准相机,使用众所周知的Zhang方法,然后使用捆绑调整,这在Matlab和OpenCV中都可用。有很多经验指导,但从我个人的经验来看,准确性是相当随机的。有时可能真的很好,但有时也很糟糕。只要简单地将棋盘放在不同的位置,结果实际上会有很大的不同。假设目标摄像机是直线的,水平视场为110度

  • 棋盘格中的方块数是否影响精度?张在他的原始论文中使用了8x8,但没有真正解释原因

  • 正方形的长度会影响精度吗?张使用了17cm x 17cm,但没有真正解释原因

  • 不同棋盘位置/方向的最佳快照数是多少?张只使用了5张图片。我看到有人用不同角度的棋盘建议20~30张图像,填满整个视野,向左、右、上、下倾斜,并建议不要在类似的位置/方向放置棋盘,否则结果将偏向该位置/方向。这是正确的吗


  • 我们的目标是制定一个工作流程,以获得一致的校准结果。

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

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


    此外,我建议您尝试在MATLAB中使用。至少,看一下文档,其中有很多关于校准相机的有用建议。

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

    我不久前在中写了一些建议,我建议你遵循它们。特别是,要注意锁定焦距(我已经看到和听到无数人试图在自动对焦上校准相机,并且非常失望)。至于目标的大小,同样取决于你的光学和相机分辨率,但一般来说,目标是(1)用测量填充视野和你将使用的空间体积,(2)观察显著的透视缩短,因为这是FOV解决方案的限制因素。祝你好运

    [教育署发表评论]


    关于连续校准过程中参数值的变化,我要做的第一件事是计算交叉RMS误差,即在数据集2上校准相机的情况下,数据集1上的RMS误差,反之亦然。如果其中任何一个明显高于校准误差,则表明相机在两次校准之间发生了变化,因此所有几率均为零。你有自动对焦、虹膜、变焦、稳定功能吗?关掉它们:自动校准是校准的祸根,唯一的例外是曝光时间。否则,您需要查看您观察到的参数变化是否真正有意义(提示,它们通常没有意义)。以像素为单位的焦距变化(千分之几)可能与今天的传感器分辨率无关-您可以通过以毫米表示并将其与传感器的点间距进行比较来验证这一点。此外,主点位置以数十像素的顺序变化是常见的,因为除非非常仔细地设计校准程序来估计它,否则观察到的情况很差

    我要测量的距离并不局限于一个小区域。大概在2米到50米之间。你能详细说明一下为什么“理想情况下,你想把棋盘放在离相机大致相同的距离,就像你想测量的距离一样”的数学方面吗?我认为距离不重要。也谢谢你的建议。理论上,距离并不重要。实际上,你有噪声、量化误差、舍入误差等,所以你要尽可能靠近你要进行测量的地方进行校准。我可以拍摄20张棋盘图像,然后得到一组参数,即焦点、原理点和失真参数,对于给定的棋盘图像,具有较低的RMS投影错误。问题是,如果我再拍摄20张棋盘图像,我得到的参数相对于给定的棋盘图像仍然具有较低的RMS投影误差,但可能与之前确定的参数有很大的差异。问题是我如何知道哪一组参数是正确的?什么样的正确工作流程可以保证一致的结果?