如何验证网络摄像机校准的正确性?
camera-calibration
computer-vision
opencv
5
0

我是相机校准技术的新手...我正在使用OpenCV棋盘技术...我正在使用Quantum的网络摄像头...

这是我的观察和步骤。

  1. 我将每个国际象棋正方形的边都保留为3.5厘米。这是一个7 x 5棋盘,带有6 x 4内角。我正在从网络摄像头1到1.5 m的距离拍摄10张不同视角/姿势的图像。
  2. 我正在按照Bradski的 Learning OpenCV中的C代码进行校准。我的校准代码是

     cvCalibrateCamera2(object_points,image_points,point_counts,cvSize(640,480),intrinsic_matrix,distortion_coeffs,NULL,NULL,CV_CALIB_FIX_ASPECT_RATIO); 
  3. 在调用此函数之前,我将沿固有矩阵对角线的第一个和第二个元素设为一个,以保持焦距比恒定,并使用CV_CALIB_FIX_ASPECT_RATIO

  4. 在国际象棋棋盘中的距离的改变fxfy与改变fx:fy几乎等于1有cxcy的值在200以400的fxfy是在300的顺序- 700时我改变距离。

  5. 目前,我将所有失真系数都设为零,因为我没有得到包括失真系数在内的好结果。我的原始图像比未失真的图像看起来更漂亮!!

我是否正确进行校准?除了CV_CALIB_FIX_ASPECT_RATIO之外,我还应该使用其他任何选项吗?如果是,请选择哪一个?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

嗯,您要寻找“帅”还是“准确”?

相机校准是计算机视觉中为数不多的学科之一,可以通过物理术语直接量化其准确性,并通过物理实验对其进行验证。通常的教训是(a)您的数字与您付出的努力(和金钱)一样好,并且(b)实际准确性(与想象中的相反)非常昂贵,因此您应该事先弄清楚您的应用程序确实需要精确的方式。

如果您查看甚至非常便宜的镜头/传感器组合(在百万像素范围及以上)的几何规格,则很显然在理论上可以在桌面空间内达到亚毫米以下的校准精度。只需算出(从相机传感器的规格表中)一个像素跨越的立体角-钱包所能达到的空间分辨率就会使您眼花azz乱。但是,实际上要达到可重复的目标就需要理论上的准确性。

以下是一些建议(从个人经验中得出),以使您对自产设备具有良好的校准体验。

  1. 如果您的方法使用的是扁平目标(“棋盘格”或类似的棋盘),请制造一个好的目标。选择一个非常平坦的背衬(对于您提到的尺寸大于或等于5毫米的窗户玻璃,虽然很脆弱,但还是很不错的)。验证其相对于另一条边缘(或更好的是激光束)的平坦度。在不会很容易拉伸的厚纸上打印图案。打印后将其放在背衬上,然后再粘贴,并验证正方形的确确实非常接近正交。廉价的喷墨或激光打印机并非为严格的几何精度而设计,不要盲目相信它们。最佳做法是使用专业的印刷店(即使Kinko印刷店也比大多数家用打印机做得更好)。然后,使用喷涂胶水将图案非常仔细地附着在背衬上,然后用软布缓慢擦拭,以免产生气泡和拉伸。等待一天或更长时间使胶水固化,并使胶纸应力达到其长期稳定状态。最后用一个好的卡尺和一个放大镜测量拐角位置。您可能会用一个单一的数字表示“平均”平方尺,但它必须是实际测量值的平均值,而不是希望祈祷的平均值。最佳实践是实际使用测量位置表。

  2. 注意温度和湿度的变化:纸张会吸收空气中的水,衬背会膨胀并收缩。令人惊讶的是,您可以找到多少篇文章都报告了亚毫米校准精度,而没有引用环境条件(或对它们的目标响应)。不用说,它们大部分都是垃圾。与普通的金属板相比,玻璃的较低的温度膨胀系数是偏爱玻璃板作为背衬的另一个原因。

  3. 不用说,如果具有以下功能,则必须禁用相机的自动对焦功能:对焦会在镜头内部物理移动一个或多个玻璃,从而(略微)改变视野和(通常会改变很多)镜头畸变和要点。

  4. 将相机放在不会轻易振动的稳定安装座上。根据应用程序的需要进行对焦(如果镜头有光圈,则使镜头停焦(如果没有光圈,则使镜头自动停止)-校准程序和目标必须根据应用程序的需求而设计,而不是相反)。之后甚至不要想到触摸相机或镜头。尽可能避免使用“复杂”的镜头,例如变焦镜头或非常广角的镜头。例如,变形镜头需要比OpenCV提供的模型复杂得多的模型。

  5. 进行大量测量和拍照。您需要每个图像数百个测量值(角)和数十个图像。在涉及数据的地方,越多越好。我会考虑使用10x10的棋盘格。我通常以20x20的分辨率工作。

  6. 拍摄照片时,请跨越校准音量 。理想情况下,您希望测量值均匀分布在要处理的空间中。最重要的是,请确保在某些图片中使目标相对于焦轴明显倾斜 -要校准焦距,您需要“看到”一些真实的透视图。为了获得最佳效果,请使用可重复的机械夹具移动目标。一个好的是单轴转盘,它将为您提供出色的目标运动模型。

  7. 拍摄照片时尽量减少振动和相关的运动模糊。

  8. 使用良好的照明。真。令人惊讶的是,我经常看到人们在游戏后期意识到您需要光子来校准任何摄像机:-)使用漫射环境照明,并将其从视野两边的白卡上反射回来。

  9. 观察您的角落提取代码在做什么。在图像上方绘制检测到的角位置(例如在Matlab或Octave中),并判断其质量。使用严格的阈值尽早消除异常值比信任捆绑调整代码中的鲁棒性更好。

  10. 如果可以,请约束模型。例如,如果您没有充分的理由相信镜头在图像上明显偏离中心,则不要尝试估计主点,只需在第一次尝试时将其固定在图像中心即可。主点位置通常是很差观察到的,因为它固有地非线性失真的中心和该组件平行于靶到相机的平移的图像平面相混淆。得到它的权利需要一个精心设计的过程,产生了场景非线性失真的一个非常好的包围的三个或更多的独立的消失点。同样,除非您有理由怀疑镜头聚焦轴确实在传感器平面上倾斜,否则将相机矩阵的(1,2)分量固定为零。一般来说,请使用可以满足您的测量应用需求的最简单模型(这是Ockam的剃须刀)。

  11. 当您的优化器提供的校准解决方案具有足够低的RMS误差(通常为十分之几像素)时,请绘制残留误差的XY模式(所有图像中每个角的predicted_xy -measured_xy) 看看它是否是以(0,0)为中心的圆角云 。异常值的“团块”或残差云的非圆度正在发出警报,警告某些问题非常严重-可能是由于错误的角检测或匹配或不适当的镜头失真模型而导致的异常值。

  12. 拍摄额外的图像以验证解决方案的准确性-使用它们来验证是否确实消除了透镜畸变,以及由校准模型预测的平面单应性实际上与从测量的角点恢复的单应性相符。

收藏
评论

这是一个比较晚的答案,但对于从Google来的人来说:

检查校准准确性的正确方法是使用OpenCV提供的重投影误差 。我不确定为什么在答案或注释中没有提到这一点,您无需手动计算,这是calibrateCamera的返回值。在Python中,它是第一个返回值(随后是相机矩阵等)。

再投影误差是指使用固有系数投影点与实际图像中的点之间的RMS误差。 通常,您应该期望RMS误差小于0.5像素 -使用机器视觉相机,我通常可以得到约0.1像素的误差。重投影误差在许多计算机视觉论文中都有使用,没有一种明显更容易或更准确的方法来确定您的校准质量。

除非您有立体声系统,否则您只能计算出3D空间中直到射线为止的某物,而不是一点。但是,由于可以计算出每个平面校准图像的姿态,因此可以计算出每个棋盘角应落在图像传感器上的位置。校准过程(或多或少)试图找出这些射线落在哪里,并使所有不同校准图像上的误差最小。在张的原始论文和随后的评估中,大约10到15张图像就足够了。此时,随着添加更多图像,错误不会显着减少。

Matlab等其他软件包将为您提供每个固有像素的误差估计,例如焦距,投影中心。我一直无法使OpenCV吐出这些信息,但是也许它在某个地方。 Matlab 2014a现在提供了相机校准功能,但是您仍然可以使用相机校准工具箱,该工具箱在计算机视觉用户中非常流行。

http://www.vision.caltech.edu/bouguetj/calib_doc/

目视检查是必要的,但在处理结果时还不够。要查找的最简单的事情是, 世界上的直线在未失真的图像中变为直线 。除此之外,仅通过查看输出图像就无法真正确定相机是否已正确校准。

Francesco提供的例程很好,请遵循。我用搁板作为飞机,将图案印在海报纸上。确保图像曝光良好-避免镜面反射!我使用标准的8x6模式,我尝试过使用更密集的模式,但是没有看到如此精确的改进以至于有所作为。

我认为对于大多数想要校准摄像机的人来说,这个答案应该足够了-实际上,除非您试图校准诸如Fisheye之类的奇特东西,或者出于教育原因而这样做,否则OpenCV / Matlab就是您所需要的。 Zhang的方法被认为足够好,几乎计算机视觉研究中的每个人都使用它,并且大多数人都使用Bouguet的工具箱或OpenCV。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号