如何验证网络摄像头校准的正确性?

时间:2012-10-09 07:25:19

标签: opencv computer-vision camera-calibration

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

以下是我的观察和步骤..

  1. 我保持每个国际象棋方面= 3.5厘米。这是一个7 x 5的棋盘,内部有 6 x 4 角。我在距离网络摄像头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. 在调用此函数之前,我将沿着内部矩阵的对角线的第一个和第二个元素作为一个,以保持焦距的比例恒定并使用CV_CALIB_FIX_ASPECT_RATIO

  4. 随着国际象棋棋盘距离的变化,fxfy正在变化,fx:fy几乎等于1. cx和{{cy 1}}值的大小为200到400.当我改变距离时,fxfy大约为300-700。

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

  6. 我正确进行校准吗?我应该使用除CV_CALIB_FIX_ASPECT_RATIO以外的任何其他选项吗?如果是,哪一个?

1 个答案:

答案 0 :(得分:28)

这是一个相当晚的答案,但对于那些来自谷歌的人来说:

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

重投影误差是使用固有系数投影点的位置与实际图像中的点之间的RMS误差。 通常你应该期望RMS误差小于0.5px - 我可以通过机器视觉相机常规地获得0.1px左右。重投影错误用于许多计算机视觉文件中,没有一种更容易或更准确的方法来确定您的校准有多好。

除非你有一个立体声系统,否则你只能在三维空间中找到射线的位置,而不是一个点。然而,由于可以计算出每个平面校准图像的姿势,因此可以计算出每个棋盘角落应该落在图像传感器上的位置。校准过程(或多或少)尝试计算出这些光线下落的位置,并使所有不同校准图像上的误差最小化。在张的原始论文和随后的评估中,大约10-15个图像似乎就足够了;此时,随着更多图像的添加,误差不会显着降低。

Matlab等其他软件包可以为您提供每个内在函数的误差估计,例如:焦距,投影中心。我一直无法让OpenCV吐出那些信息,但也许它就在某处。相机校准现在已经在Matlab 2014a中得到了解决,但您仍然可以掌握相机校准工具箱,这对计算机视觉用户来说非常受欢迎。

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

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

Francesco提供的例程很好,请遵循这一点。我用架子板作为我的飞机,图案印在海报纸上。确保图像曝光良好 - 避免镜面反射!我使用的是标准的8x6模式,我尝试过更密集的模式但是我没有看到这种精确度的提高,因此它有所作为。

我认为对于大多数想要校准相机的人来说,这个答案应该足够了 - 除非你试图校准像鱼眼这样的异国情调,或者你出于教育原因这样做,否则这个答案是真实的,OpenCV / Matlab是一切你需要的。张的方法被认为足够好,几乎所有计算机视觉研究都使用它,而且大多数都使用Bouguet的工具箱或OpenCV。