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


16

首先,我希望这是正确的Stack Exchange开发板。如果没有,我深表歉意。

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

互联网上有许多教程,其中给出了多个国际象棋棋盘视图,并从每个帧中提取角点。

是否有一组最佳视图可赋予该功能以获得最准确的相机校准?什么会影响校准的准确性?

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

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

Answers:


8

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

像“广角”或“ 360°”这样的“特殊”相机中的失真系数更高。

这是有关校准的Wikipedia条目。这是非线性失真,对于大多数相机而言,可以忽略不计。


通过欧拉尔角,我假设您的意思是在x,y上围绕棋盘旋转摄像机(以棋盘为枢轴),并在z方向上朝着或远离棋盘移动摄像机?我读到某人只是简单地打印出变形后的棋盘,并将相机放置在同一位置的信息。例如:i.imgur.com/rYzV4.pngi.imgur.com/McG9z.png。使用这样的事情是否是一个错误的决定,因为它可能无法代表现实中事物的距离?
猎豹

是的,关于移动相机。再说一遍关于保持原状。
mirror2image

@ mirror2image您的意思是,在实际操作中,最好更改不同的角度。但这意味着不同的观点将具有不同的世界协调系统。我是否需要使用共享的世界坐标系来将对象点保持在同一坐标系中?
理查德

3

@Ben-观看次数取决于相机和所需的最终精度。

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

有了镜头芯片的中心和焦距(在X和Y方向上)后,您只需在镜头中放一个棋盘即可为您提供相机位置


我的校准一直很差,老实说我不知道​​为什么。我在墙上有一块印刷好的棋盘,并且要将相机移动到不同的位置,因此它在棋盘上有不同的视图,但是每当我在opencv中使用undistort函数时,它与原始的相比就显得非常奇怪和失真。我的相机是Microsoft LifeCam Studio 1080p。
猎豹

@Ben禁用任何自动对焦。在微小的镜头网络摄像头上,焦距和镜头中心会随焦点变化。您是否旋转得足以使其适合中心位置?广场到角落了吗?最后检查所有目标是否都检测到所有平方。
马丁·贝克特

自动对焦已被禁用。定义够了吗?我正在尽力争取极端的角度。如果您的意思是在图像上绘制提取的角的函数,则不确定“角出正方形”的意思-是的。我也已经检查过所有角落。我认为我的问题可能在于我将初始焦距设置在传递给校准函数的本征矩阵中。我尝试了1:1、16:9(我相信摄像头的宽高比是多少),还尝试了“什么都没有”(您可以这样做)
猎豹

@Martin是否可以通过将相机保持在文具位置并更改棋chess方向来进行校准,而无需更改相机与棋chess之间的距离?

@Santosh-是的,这显然是完全等效的。您需要确保覆盖了许多不同的角度
Martin Beckett

3

我决定在此处发布此答案,因为前不久,这是Google的最佳结果,它的建议对我有所帮助。因此,我决定也分享我的经验。

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

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

另外,以防万一我死了或者忘记更新主机,这是该帖子的修改后报价:

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

3

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

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

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


嗨,欢迎来到DSP SE。在这里通常不欢迎自我促进的答案。请考虑做出更高质量的答案。
jojek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.