Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 什么是最好的摄像机校准方法?_Matlab_Opencv_Computer Vision_Camera Calibration_Matlab Cvst - Fatal编程技术网

Matlab 什么是最好的摄像机校准方法?

Matlab 什么是最好的摄像机校准方法?,matlab,opencv,computer-vision,camera-calibration,matlab-cvst,Matlab,Opencv,Computer Vision,Camera Calibration,Matlab Cvst,我理解上述问题是广泛而模糊的。 但要结合上下文: 我试图确定摄像机姿势和位置估计的准确性。我花了几个星期校准和尝试不同的方法和不同大小的电路板、照明、距离等 我尝试过的方法: 手动调整值 说明: 在相机前面使用大约20幅不同方向和位置的图像,每幅图像 用于尺寸为25mm、32mm和50mm的9x6棋盘格 在1280x720和1920x1080两种分辨率下 距离较小的板为500mm,较大的板为2000mm 在所有情况下,我都按照此链接遵循了严格的指导原则 在上述所有因素的组合中,我得

我理解上述问题是广泛而模糊的。 但要结合上下文: 我试图确定摄像机姿势和位置估计的准确性。我花了几个星期校准和尝试不同的方法和不同大小的电路板、照明、距离等

我尝试过的方法:

  • 手动调整值
说明:

  • 在相机前面使用大约20幅不同方向和位置的图像,每幅图像
  • 用于尺寸为25mm、32mm和50mm的9x6棋盘格
  • 在1280x720和1920x1080两种分辨率下
  • 距离较小的板为500mm,较大的板为2000mm
在所有情况下,我都按照此链接遵循了严格的指导原则

在上述所有因素的组合中,我得到的结果相差几毫米(+-15mm) 上述方法中1280x720处25mm块的内部函数范围如下:

  • OpenCV的内置校准方法>fx=1269.4 fy=1269.49 cx=639.5 cy=359.5
  • Matlab校准工具箱>fx=1259.53 fy=1260.76 cx=661.3 cy=306.5
  • Matlab校准App>fx=1255.1 fy=1254.8 cx=652.6 cy=340.7
  • 手动调整值。>各种结果,除cx=639.5 cy=359.5外,均不稳定
事实不应如此。当处理小于1米的距离时,摄像机相对于电路板原点的位置应精确到平均1毫米或2毫米(如果不是亚毫米)的精度。除非我弄错了


我的问题是,对于高清网络摄像头来说,什么是理想的、简单的校准方法,失真很小?

有许多可能的误差源

首先,虽然您尝试过的所有三种校准实现基本上使用相同的算法,但有足够多的差异可以解释结果中的差异

主要区别在于棋盘格角点检测。加州理工学院校准工具箱没有自动棋盘格检测功能,而是使用第二次优化过程来细化角点。OpenCV和Camera校准器应用程序都会自动检测棋盘,但Camera校准器应用程序中使用的算法要好得多。它更健壮,这意味着当OpenCV没有检测到电路板时,它很可能检测到电路板,并且它的亚像素定位更精确。我的观点是,在这三种方法中,使用不同的数据点进行校准。因此,你的结果不同也就不足为奇了

校准后,会出现什么样的重投影错误?摄像头校准器应用程序会向您显示重投影错误的条形图。您应该查看它,并排除给您带来高错误的图像。理想情况下,您希望平均重投影误差小于半个像素。越低越好

现在我要问你,你是如何测量从相机到棋盘的距离的?从校准中获得的外部信息表示从棋盘坐标系到相机坐标系的转换,相机坐标系的原点位于相机外壳内部的光学中心。这很难精确测量。一个更好的方法是。事实上,您可以测量检测到的棋盘格角点之间的距离。请注意,检测精度是另一个误差来源


另外,请确保不要将校准图像保存为jpeg格式。压缩伪影将影响棋盘格角点检测的准确性。使用像tiff或png这样的无损格式。

来参加这个聚会有点晚,但如果可以的话

考虑到这三个应用程序虽然主要依赖于相同的算法(对于OpenCV和Matlab工具包,甚至共享一位作者),但它们具有不同的实现和不同的性能,它们之间的差异并不那么令人惊讶。如果您有兴趣进行公平的比较,您至少应该使用相同的测量集(即检测到的角点的位置,以及亚像素细化)驱动它们,以便输出中的任何差异纯粹是由于实现造成的。已经正确地指出,通过使用不同的图像格式,可以有效地使用不同的测量集

你在主点上观察到的变化也不足为奇:很难准确估计它,因为

  • 重投影误差对其位置不太敏感,即,您试图优化的成本函数在(cx,cy)子空间中的最优值附近大部分是“平坦的”(请参阅中的深入讨论),以及
  • 它本质上和非线性失真的中心以及平行于世界图像平面的分量对摄像机的平移相混淆
后一点意味着,主点的微小且难以检测的变化将导致显著的三维位置误差,除非添加额外的约束,这使得受约束的误差函数在感兴趣的数量上不平坦,即摄像机相对于校准装置的绝对位置和方向

要添加的方便约束包括:

  • 标定目标和摄像机相对运动的先验模型。例如,如果棋盘格目标附着到转盘,则可以优化其运动的中心和轴(3+2参数),而不是单个目标位置姿势的6 x num_images参数
  • 相对于非平面固定装备(或与装备相关的点和方向,如上所述)的多个摄像机位置

据我所知,openCVs和Matlabs的校准方法是相同的……我不确定如何解释您的陈述——因为如果我遵循