如何validation摄像头校准的正确性?

我完全不熟悉相机校准技术…我正在使用OpenCV棋盘技术…我使用Quantum的networking摄像机…

这是我的观察和步骤..

  1. 我保留了每个棋方方= 3.5厘米。 这是一个7×5的棋盘, 6×4的内angular。 我在networking摄像头的距离为1到1.5米处采集了10张不同视图/姿势的图像。
  2. 我正在学习Bradski 学习OpenCV中的C代码进行校准。 我的校准码是

    cvCalibrateCamera2(object_points,image_points,point_counts,cvSize(640,480),intrinsic_matrix,distortion_coeffs,NULL,NULL,CV_CALIB_FIX_ASPECT_RATIO); 
  3. 在调用这个函数之前,我将沿着固有matrix的对angular线的第一个和第二个元素作为一个来保持焦距的比例不变,并使用CV_CALIB_FIX_ASPECT_RATIO

  4. 随着棋盘距离的变化, fxfy随着fx:fy变化几乎等于1.有cxcy值在200到400的顺序fxfy在300-700的数量级我改变了距离。

  5. 目前我已经把所有的失真系数归零,因为我没有得到包括失真系数在内的好结果。 我原来的形象看起来比不失真的英俊!

我是否正确地进行校准? 我应该使用除CV_CALIB_FIX_ASPECT_RATIO其他选项吗? 如果是,哪一个?

嗯,你在寻找“英俊”还是“准确”?

相机校准是计算机视觉领域中为数不多的几个主题之一,其精度可以直接用物理量化,并通过物理实验进行validation。 而通常的教训是:(a)你的数字和你付出的努力(和金钱)一样好,(b)真正的准确性(与想象的相反)是昂贵的,所以你应该提前你的应用程序真正要求的精度。

如果您查看甚至是非常便宜的镜头/ ccd组合的几何规格(在百万像素范围及以上),则显而易见的是,在桌面的空间体积内理论上可实现亚 – 亚毫米校准精度。 只要从摄像头的传感器的规格表中计算出一个像素的立体angular,您的钱包所能达到的空间分辨率就会让您眼花缭乱。 然而,实际上达到理论精度附近的东西需要工作。

这里有一些build议(从个人经验),以获得与本土设备良好的校准经验。

  1. 如果你的方法使用一个平坦的目标(“棋盘”或类似的),制造一个好的。 select一个非常平坦的后盾(对于你提到的窗户玻璃5毫米厚或更多的大小是优秀的,但显然脆弱)。 validation其对另一个边缘(或更好,激光束)的平坦度。 在厚纸上打印不会太容易拉伸的图案。 在粘合之前在背衬上打印之后将其铺好,并确认正方形确实是非常接近正交的。 廉价的喷墨打印机或激光打印机的devise不是严格的几何精度,不要盲目信任它们。 最佳做法是使用专业的印刷厂(即使是金科的印刷厂也会比大多数家用印刷机做得更好)。 然后使用喷涂胶将图案非常小心地粘在背衬上,并用软布慢慢擦拭,以避免气泡和拉伸。 等待一天或更长时间使胶水固化,胶纸应力达到其长期稳定状态。 最后用一个好的卡尺和一个放大镜来测量angular落的位置。 你可能会得到一个单一的数字为“平均”的平方尺寸,但它必须是实际测量的平均值,而不是希望 – 祈祷者的平均值。 最佳做法是实际使用一个测量位置表。

  2. 注意温度和湿度的变化:纸张吸附空气中的水分,背部膨胀和收缩。 有多less文章可以find,报告亚毫米校准精度,而无需引用环境条件(或目标响应)。 不用说,他们大多是废话。 玻璃较普通金属板较低的温度膨胀系数是偏好前者作为后盾的另一个原因。

  3. 毋庸置疑,如果镜头有自动对焦function,则必须禁用相机的自动对焦function:对焦在镜头内物理移动一个或多个玻璃片,从而改变(略微)视野范围(通常很多)镜头畸变和主要问题。

  4. 将相机放置在不易震动的稳定支架上。 如果应用需要聚焦(并且f-stop镜头,如果有虹膜的话)(而不是校准 – 校准过程和目标必须根据应用的需要devise,而不是相反)。 之后不要考虑触摸相机或镜头。 如果可能的话,避免使用“复杂”镜头 – 例如变焦镜头或非常广angular镜头。 鱼眼镜头或变形镜头需要的模型要比OpenCV提供的库存复杂得多。

  5. 采取大量的测量和图片。 您需要每个图像数百个测量值(angular),以及数十个图像。 在数据方面,越多越好。 10×10棋盘是我会考虑的绝对最小值。 我通常在20×20工作。

  6. 拍照时跨越校准音量 。 理想情况下,您希望您的测量数据均匀分布在您将要使用的空间体积中。 最重要的是,确保在一些照片中相对于焦点轴显着倾斜目标 – 校准焦距,以便“看到”一些真实的透视缩短。 为获得最佳效果,请使用可重复的机械夹具来移动目标。 一个好的是一个单轴转盘,它将为您提供一个优秀的目标运动模型。

  7. 拍照时最大限度地减less振动和相关的运动模糊。

  8. 使用良好的照明。 真。 令人惊奇的是,在游戏的后期,我经常会看到人们需要光子来校准任何相机:-)使用漫射的环境光照,并将其从视野两侧的白色卡片上reflection回来。

  9. 观看你的angular点提取代码在做什么。 在图像顶部绘制检测到的angular落位置(例如在Matlab或Octave中),并判断其质量。 尽早使用严格的阈值去除exception值要比信任捆绑调整代码中的robustifier要好。

  10. 如果可以的话,约束你的模型。 例如,如果您没有足够的理由相信您的镜头与图像明显偏离中心,请不要试图估计主要点,只需在第一次尝试时将其固定在图像中心即可。 主点位置通常观察不到,因为它本质上非线性失真的中心以及平行于目标 – 摄像机平移的图像平面的分量混淆。 要做到这一点需要经过精心devise的程序,可以产生场景的三个或更多个独立的消失点, 并且非常好地包围非线性失真。 同样,除非您有理由怀疑镜头焦点轴确实相对于传感器平面倾斜,否则将摄像机matrix的(1,2)分量固定为零。 一般来说,使用最简单的模型来满足您的测量您的应用需求(这就是Ockam的razor)。

  11. 当你的优化器有足够低的均方根误差(几十分之一个像素,通常见下面的答案)的优化器的校准解决scheme时,绘制剩余误差的XY模式(所有图像中每个angular落的prediction_xy – measured_xy)和看看它是以(0,0)为中心的圆周云 。 exception值的“团块”或残余云的非圆度尖叫警报铃声,这是非常错误的 – 很可能是exception值,或不适当的镜头失真模型。

  12. 用额外的图像来validation解决scheme的准确性 – 使用它们来validation镜头畸变实际上是否被消除,并且由校准模型预测的平面单应性实际上匹配从被测angular落恢复的平面单应性。

这是一个相当晚的答案,但是对于Google来的人来说:

检查校准精度的正确方法是使用OpenCV提供的再投影错误 。 我不确定为什么在回答或评论中没有提到这一点,你不需要手动计算这个 – 这是calibrateCamera的返回值。 在Python中,它是第一个返回值(后面是相机matrix等)。

重投影误差是使用固有系数投影点的位置与实际图像中的位置之间的RMS误差。 通常情况下,您应该可以得到小于0.5px的RMS误差 – 机器视觉相机通常可以达到0.1px左右。 再投影错误被用在许多计算机视觉文件中,确定你的校准有多好没有一个更容易或更准确的方法。

除非你有一个立体声系统,否则你只能找出3D空间中的某个物体,而不是一个点。 但是,可以计算每个平面校准图像的姿态,可以计算出每个棋盘angular落落在图像传感器上的位置。 校准过程(或多或less)试图找出这些光线落在的位置,并最小化所有不同校准图像上的误差。 在张先生的原创论文中,以及随后的评估中,大约10-15幅图像似乎已经足够。 在这一点上错误不会显着减less,增加更多的图像。

像Matlab这样的其他软件包会给你每个单独的内在的误差估计,例如焦距,投影中心。 我一直无法让OpenCV吐出这些信息,但也许它在某处。 相机校准现在在Matlab 2014a中是原生的,但是您仍然可以获得非常受计算机视觉用户欢迎的相机校准工具箱。

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

目视检查是必要的,但不足以处理你的结果。 要寻找的最简单的事情是, 世界上的直线在你未失真的图像中变得直线 。 除此之外,仅仅通过查看输出图像,就不可能确定您的相机是否被校准。

弗朗西斯科提供的例程是好的,跟着。 我用架板作为我的飞机,在海报纸上印上图案。 确保图像曝光良好 – 避免镜面reflection! 我使用了一个标准的8×6模式,我尝试了更密集的模式,但是我还没有看到这种改进的准确性,它有所作为。

我认为这个答案应该足够大多数人想要校准一个摄像头 – 除非你正在尝试校准像鱼眼这样的异国情调,或者出于教育的原因进行校准,OpenCV / Matlab是你所需要的。 Zhang的方法被认为是足够好的,几乎所有的计算机视觉研究人员都使用它,而且大多数都使用了Bouguet的工具箱或者OpenCV。