我正在做一些需要校准相机的事情。我已经在OpenCV(C ++)中成功实现了执行此操作的代码。我正在使用内置的棋盘功能和已打印出的棋盘。
互联网上有很多教程,它们给出了多个棋盘视图并从每个框架中提取角。 br />
是否有最佳视图集可以使该功能获得最准确的相机校准?什么会影响校准的准确性?
例如,如果我给它5张相同视图的图像而没有移动任何东西,当我尝试不扭曲网络摄像头时,它会给出一些直接的结果。
仅供参观的人参考:最近我发现,使用非对称圆网格和相应的OpenCV功能,可以更好地校准相机。
#1 楼
您必须从不同的视角和角度拍摄图像以进行校准,各角度之间的差异应尽可能大(所有三个Euler角度都应变化),但是图案直径仍适合相机的视野。您使用的视图越多,校准效果越好。这是必需的,因为在校准期间您会检测焦距和失真参数,因此要通过最小二乘法获得它们,则需要不同的角度。如果您根本不移动相机,那么您将无法获得新的信息并且校准是无用的。请注意,您通常只需要焦距,即使对于家用相机,网络相机和手机,失真参数也可以忽略不计。相机。如果您已经从相机规格中了解了焦距,则可能甚至不需要进行校准。
“特殊”相机(例如广角镜头或360°镜头)中的失真系数更高。
这是有关校准的Wikipedia条目。
这是非线性失真,对于大多数摄像机而言,可以忽略不计。
#2 楼
我决定在此处发布此答案,因为前不久,这是Google的最佳结果,它的建议对我有所帮助。因此,我决定也分享我的经验。校准,更具体地说是Kinect,我相信这些提示将对任何尝试校准相机的人有所帮助。 br />确保具有最大可能的校准图案。遵循我上面所说的。获得专业印刷的精美图案。
确保每个正方形至少8cm x 8cm。另外,请确保校准图案的一侧
具有奇数个正方形,而另一侧
具有偶数个正方形(例如9×6或7×8)。重要的是
正确检测目标的姿势。此外,如果不满足此要求,一些工具箱
将无法检测图案。
如前所述,我在这里上传了适合
打印大张纸的图案(适用于9cm的正方形)和此处的
(适用于10cm的正方形)。
请确保打印的图案周围有足够的白色边框,否则大多数工具箱可能很难检测到该图案。
请确保Kinect不会移动。我安装在三脚架上。
尝试获取尽可能多的校准目标图像。我最好的校准是使用300张图像获得的,其距离相机的距离低至
0.5米到10米。确保围绕X,Y和Z轴旋转图案。同样,尝试使用在相同距离拍摄的图像
“平铺”视图:即拍摄一张图像,将目标
移动到视野中的下一个图块,再拍摄另一幅并重复>直到您“平铺”了所有当前视野。目标是
尽可能覆盖每个距离的整个视野。
请尽可能使用MATLAB的立体声校准应用程序。它使您可以在每个校准阶段之后消除异常值。
Update 2020:
经过了将近三年的时间。几年的行业经验使我学到了一些新东西:如果您的任务严重依赖于相机校准的正确性,请考虑构建一个快速UI,以允许您手动微调外部/内部并查看即时的视觉结果。这样,您可以专注于系统的其他部分,而不必考虑不良的相机校准对您的影响。一切准备就绪后,您就可以决定校准相机的最佳方法。
#3 楼
这是我最初在此处发布的相机校准“最佳做法”列表:https://calib.io/blogs/knowledge-base/calibration-best-practices选择正确的尺寸校准目标。足够大以适当地约束参数。最好应覆盖约。在相机图像中正面平行查看时,占总面积的一半。
以最终应用的近似工作距离(WD)进行校准。相机应聚焦在该距离上,并且在校准后应保持聚焦不变。
目标物应具有较高的功能计数。优选使用精细图案。然而,在某些时候,检测的鲁棒性受到损害。我们的建议是在3MPx以上的相机上使用良好的图案计数,并控制照明条件是否良好。
从不同的区域和倾斜角度收集图像。移动目标以完全覆盖图像区域,并实现均匀覆盖。只能从正面平行图像正确确定镜头失真,但是焦距估计取决于观察到的缩短。包括正面和垂直图像,以及在木板水平和垂直方向倾斜最大+/- 45度时拍摄的图像。倾斜更多通常不是一个好主意,因为会影响特征的定位精度。
使用良好的照明。这通常被忽略,但是非常重要。校准目标优选地应通过受控的摄影照明来漫射照明。强光点光源会导致照明不均,可能导致检测失败,并且不能很好地利用相机的动态范围。阴影也可以。
有足够的观察力。通常,应至少对校准目标的6个观测值(图像)执行校准。如果使用更高阶的摄像机或失真模型,则更多的观察结果将是有益的。
考虑使用唯一编码的目标,例如CharuCo板。这些使您可以从相机传感器和镜头的边缘收集观察结果,从而很好地限制了失真参数。另外,即使单个特征点不满足其他要求,它们也可以收集数据。
校准仅与所使用的校准目标一样精确。仅使用激光打印目标进行验证和测试。
正确安装校准目标和摄像机。为了最大程度地减小变形和在较大的目标中弯曲,请将其垂直安装或平放在刚性支架上。在这种情况下,请考虑移动相机。请使用高质量的三脚架,并避免在采集过程中接触相机。
删除不良观察。仔细检查重投影错误。每次观看和每项功能。如果其中任何一个显示为异常值,请排除它们并重新校准。
可在此处找到在线工具,用于为校准目标生成PDF:https://calib.io/pages/camera-calibration-pattern-generator
评论
$ \ begingroup $
您好,欢迎来到DSP SE。在这里通常不欢迎自我促进的答案。请考虑做出更高质量的答案。
$ \ endgroup $
–jojek♦
18-10-25在10:30
#4 楼
@Ben-视图数取决于相机和所需的最终精度。使用高质量,低畸变的镜头(高端35mm单反),使用大量棋盘图像来映射畸变可能是不稳定的-因为畸变只是像素的几分之一。由于图像中心通常仅在标称x / 2,y / 2的几个像素之内,并且会随焦点变化,因此仍然需要在板(或照相机)旋转的情况下拍摄几张照片。当然,变焦会改变一切。
一旦有了镜头芯片的中心和焦距(在X和Y方向),您只需在镜头中放一个棋盘即可为您提供相机位置
评论
$ \ begingroup $
我的校准一直很差,老实说我不知道为什么。我在墙上有一块印刷好的棋盘,并且要将相机移动到不同的位置,因此它在棋盘上有不同的视图,但是每当我在opencv中使用undistort函数时,与原始的相比,它就会变得非常奇怪和失真。我的相机是Microsoft LifeCam Studio 1080p。
$ \ endgroup $
–猎豹
2012年12月12日12:18
$ \ begingroup $
@Ben禁用任何自动对焦。在微型镜头网络摄像头上,焦距和镜头中心会随焦点变化。您是否旋转得足以使其适合中心位置?广场到角落了吗?最后检查所有目标是否都检测到所有平方。
$ \ endgroup $
–马丁·贝克特(Martin Beckett)
2012年3月12日16:07
$ \ begingroup $
自动对焦已被禁用。定义够了吗?我正在尽力争取极端的角度。如果您的意思是在图像上绘制提取的角的函数,则不确定“角出正方形”的意思-是的。我也已经检查过所有角落。我认为我的问题可能在于我将初始焦距设置在传递给校准函数的本征矩阵中。我尝试了1:1、16:9(我相信摄像头的宽高比是多少),还尝试了NOTHING(您可以这样做)
$ \ endgroup $
–猎豹
2012年3月12日下午16:20
$ \ begingroup $
@Martin是否可以通过将相机保持在文具位置并更改棋盘方向来进行校准,而无需更改相机与棋盘之间的距离?
$ \ endgroup $
–user4059
13年4月4日在4:15
$ \ begingroup $
@Santosh-是的,这显然是完全等效的。您需要确保覆盖了许多不同的角度
$ \ endgroup $
–马丁·贝克特(Martin Beckett)
13年4月4日在5:35
评论
$ \ begingroup $
通过Eulers角度,我认为您是指在x,y上围绕棋盘旋转摄像机(以棋盘为枢轴),并在z方向上朝着或远离棋盘移动摄像机?我读到某人只是简单地打印出变形后的棋盘,并将相机放置在同一位置的信息。例如:i.imgur.com/rYzV4.png和i.imgur.com/McG9z.png。使用这样的事情是否是一个错误的决定,因为它可能无法代表现实中事物的距离?
$ \ endgroup $
–猎豹
2012年2月27日在17:01
$ \ begingroup $
是的,关于移动相机。再说一遍关于保持原状。
$ \ endgroup $
–mirror2image
2012年2月28日在7:55
$ \ begingroup $
@ mirror2image您的意思是,在实际操作中,最好更改不同的角度。但这意味着不同的观点将具有不同的世界协调系统。我是否需要使用共享的世界坐标系来将对象点保持在同一坐标系中?
$ \ endgroup $
–理查德
17 Sep 11'在5:44