如何获得最准确的相机校准?

信息处理 图像处理 相机 opencv
2022-01-05 23:50:47

首先,我希望这是正确的 Stack Exchange 板。如果不是,我很抱歉。

我正在做一些需要我校准相机的事情。我已经在 OpenCV (C++) 中成功实现了执行此操作的代码。我正在使用内置的棋盘功能和我打印的棋盘。

互联网上有很多教程都指出提供多个棋盘视图并从每一帧中提取角点。

是否有一组最佳视图可提供给该功能以获得最准确的相机校准?哪些因素会影响校准的准确性?

例如,如果我给它 5 张相同视图的图像而不移动任何东西,当我尝试不扭曲网络摄像头馈送时,它会给出一些直接的结果。

仅供访问的任何人参考:我最近发现您可以通过使用不对称圆圈网格和相应的 OpenCV 函数来获得更好的相机校准。

4个回答

您必须从不同的视点和角度拍摄图像以进行校准,角度之间的差异尽可能大(所有三个欧拉角都应该有所不同),但图案直径仍然适合相机视野。您使用的视图越多,校准效果就越好。这是必需的,因为在校准期间您会检测焦距和失真参数,因此要通过最小二乘法获得它们需要不同的角度。如果您根本不移动相机,那么您就不会获得新信息并且校准是无用的。请注意,您通常只需要焦距,即使对于消费类相机、网络相机和手机相机,失真参数通常也可以忽略不计。如果您已经从相机规格中知道焦距,您甚至可能不需要校准。

失真系数更多地出现在“特殊”相机中,如广角或 360°。

这是关于校准的维基百科条目。这是非线性失真,对于大多数相机来说可以忽略不计。

我决定在这里发布这个答案,因为不久前,这是谷歌的最高结果,它的建议对我有帮助。所以我也决定分享一下我的经验。

花了无数小时试图在 Kinect 上获得最佳立体声校准,我在这里的博客文章中分享了我的技巧和发现。

尽管它适用于立体校准,更具体地说是 Kinect,但我相信这些技巧将对尝试校准相机的任何人有所帮助。

此外,万一我有一天会死或忘记更新我的主机,这里是来自帖子的修改报价:

  1. 确保您拥有尽可能大的校准模式。按照我上面说的。获得专业印刷的精美图案。确保每个正方形至少为 8cm x 8cm。此外,请确保校准图案的一侧具有奇数个正方形,而另一侧具有偶数个正方形(例如 9×6 或 7×8)。这对于正确检测目标的姿态很重要。此外,如果不满足此要求,某些工具箱将无法检测到该模式。如前所述,我使用的适合在大纸上打印的图案在此处(适用于 9 厘米见方)和此处(适用于 10 厘米见方)上传。
  2. 确保您的打印图案周围有足够的白色边框,否则大多数工具箱可能不容易检测到它。
  3. 确保 Kinect 没有移动。我安装在三脚架上。
  4. 尝试获取尽可能多的校准目标图像。我的最佳校准是使用 300 张图像获得的,距离相机低至 0.5 米到 10 米。确保围绕 X、Y 和 Z 轴旋转图案。还可以尝试用相同距离拍摄的图像“平铺”视图:即拍摄一张图像,将目标移动到视野中的下一个平铺,再拍摄一张并重复,直到您“平铺”所有当前视野。目标是尽可能覆盖每个距离的整个视野​​。
  5. 如果可能,请使用 MATLAB 的立体校准应用程序。它允许您在每个校准阶段之后摆脱异常值。

2020 年更新:
这一切都过去了将近 3 年。几年的行业经验教会了我一些新的东西:如果您的任务严重依赖相机校准的正确性,请考虑构建一个快速 UI,允许您手动微调外部/内部并立即查看视觉结果。这样,您可以专注于系统的其他部分,而不必考虑相机校准对您的影响。一切准备就绪后,您可以决定校准相机的最佳方法。

这是我最初在此处发布的相机校准“最佳实践”列表:https ://calib.io/blogs/knowledge-base/calibration-best-practices

  • 选择正确的尺寸校准目标。足够大以正确约束参数。最好它应该覆盖大约。在相机图像中正面平行观察时总面积的一半。
  • 在最终应用的大致工作距离 (WD) 处执行校准。相机应在此距离处对焦,校准后焦点应保持不变。
  • 目标应该有很高的特征数。最好使用精细图案。然而,在某些时候检测鲁棒性会受到影响。我们的建议是对 3MPx 以上的相机使用精细图案计数,并且照明是否受控且良好。
  • 收集来自不同区域和倾斜的图像。移动目标以完全覆盖图像区域并争取均匀覆盖。镜头畸变只能从正面平行图像中正确确定,但焦距估计取决于观察透视缩短。包括正面平行图像,以及板在水平和垂直方向上倾斜达 +/- 45 度时拍摄的图像。倾斜更多通常不是一个好主意,因为特征定位精度会受到影响。
  • 使用良好的照明。这经常被忽视,但非常重要。校准目标最好通过受控的摄影照明进行漫射照明。强点光源会导致照明不均匀,可能导致检测失败,并且不能很好地利用相机的动态范围。阴影也可以这样做。
  • 有足够的观察。通常,应该对一个校准目标的至少 6 个观测值(图像)进行校准。如果使用更高阶的相机或失真模型,则更多的观察是有益的。
  • 考虑使用唯一编码的目标,例如 CharuCo 板。这些允许您从相机传感器和镜头的最边缘收集观察结果,从而很好地约束失真参数。此外,即使单个特征点不满足其他要求,它们也允许您收集数据。
  • 校准仅与使用的校准目标一样准确。仅使用激光打印目标进行验证和测试。
  • 正确安装校准目标和相机。为了最大限度地减少较大目标的变形和弯曲,请将它们垂直安装或平放在刚性支架上。考虑在这些情况下移动相机。使用优质三脚架,并避免在采集过程中触摸相机。
  • 删除不良观察。仔细检查重投影错误。按视图和按功能。如果其中任何一个显示为异常值,请排除它们并重新校准。

可在此处找到为校准目标生成 PDF 的在线工具:https ://calib.io/pages/camera-calibration-pattern-generator

@Ben - 视图数量取决于相机和所需的最终精度。

对于使用大量棋盘图像来映射失真的非常高质量、低失真的镜头(高端 35 毫米单反),可能会不稳定——因为失真只是像素的几分之一。
您仍然需要在旋转板(或相机)的情况下拍摄几张照片,因为图像中心通常仅在标称 x/2,y/2 的几个像素内,并且会随着焦点的变化而变化。当然,变焦会改变一切。

一旦您有了镜头芯片中心和焦距(在 X 和 Y 中),您只需要在镜头中使用一个棋盘即可为您提供相机位置