什么是最佳相机校准方法?

4
我知道以上问题很广泛和模糊不清。但为了更好地理解: 我正在尝试确定相机的姿态和位置估计的准确性。我已经花了几周的时间进行校准,并尝试不同的方法、不同大小的板子、照明、距离等等。
我尝试过的方法: 描述:
  • 对于每个摄像头,使用大约20张不同方向和位置的图像
  • 对于尺寸为25mm、32mm和50mm块的9x6棋盘格
  • 在1280x720和1920x1080两种分辨率下
  • 距离范围从小板子的500mm到大板子的2000mm

在所有情况下,我都按照此链接的严格指南进行操作如何验证网络摄像头校准的正确性?

在上述因素的所有组合中,我得到的结果偏差几毫米(+-15mm)

我的25mm块1280x720方法的内参如下:

  • 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标定应用程序 > fx = 1255.1 fy = 1254.8 cx = 652.6 cy = 340.7
  • 手动调整值。>各种结果,除了cx = 639.5 cy = 359.5之外都不稳定

这不应该是这种情况。相机相对于板子原点的位置精度应该平均为一毫米或两毫米,如果距离小于1米,则精度甚至可能达到亚毫米级别。除非我搞错了?

我的问题是,对于一个带有少量畸变的高清网络摄像头,什么是理想的简单校准方法?


就我所知,OpenCV和Matlab的校准方法是相同的。 - Ander Biguri
3
我不确定如何解释你的陈述"在所有情况下,我都按照严格的指南进行了操作..."。因为如果我点击链接,在#4下我看到:“进行大量测量和拍照。您希望每个图像有数百个测量点(角落),并且有十几张图像。就数据而言,越多越好。 10x10方格棋盘是我考虑的绝对最低限度。 我通常使用20x20。” - 但是你使用的是一个9x6的棋盘? - Schorsch
1
这是真的。我的项目是确定大约3米距离的准确性。使用较小的块变得更难检测,而使用10x10则在检测180度旋转时产生错误。我还阅读了一些来源(其中一个在stackoverflow中找不到),说明没有必要有那么多图像。我发现我的重新投影误差随着图像数量的增加而增加。在拒绝高误差图像后,我只剩下20张图像。 - Grim
2个回答

13

存在许多可能的错误源。

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

主要区别在于棋盘格角点检测。Caltech校准工具箱没有自动棋盘格检测,并使用第二次优化传递来优化角点。OpenCV和Camera Calibrator应用程序都可以自动检测到棋盘格,但Camera Calibrator应用程序中使用的算法更好。它更加健壮,意味着当OpenCV无法检测到棋盘格时,它可能会检测到,而且其亚像素定位更精确。我的观点是,在这三种方法中,您正在使用不同的数据点进行校准。因此,你的结果不同并不令人意外。

一旦您进行了校准,您会得到什么样的投影误差? Camera Calibrator应用程序会向您显示重投影误差的条形图。您应该查看它,并排除使您产生高误差的图像。理想情况下,您希望平均重投影误差小于半个像素。值越小越好。

现在我必须问您,您是如何测量相机到棋盘的距离的?校准中获得的外参表示从棋盘坐标系转换到相机坐标系的变换,其原点在相机盒内部,在其光学中心。这很难精确测量。更好的方法是在棋盘上放置一个已知尺寸的平面物体,并使用相机进行测量。实际上,您可以测量检测到的棋盘角之间的距离。请注意,检测精度是另一种错误源。

还有一件事,请确保不要将校准图像保存为jpeg。压缩伪影会影响棋盘格角点检测的准确性。使用类似tiff或png的无损格式。


谢谢您的回答。我明白结果会有所不同,只是希望它们更相似一些。在排除高误差图像后,我使用Matlab应用程序和Caltec工具箱都得到了低于0.199的重投影误差。 - Grim
你的JPEG信息很有趣。我在Caltec的工具箱中使用了JPEG,但在OpenCV和Matlab的应用程序中都使用了PNG。我将尝试使用TIFF并回报结果。 - Grim
0.199听起来不错...你的±15毫米误差怎么样了?你是如何测量的? - Dima
我正在使用标准卷尺测量棋盘原点到镜头的距离,以及从中心线(主点线)到镜头的距离。(我知道这种测量工具并不是非常科学,但这是我唯一拥有的工具)。 - Grim
2
我可以确认以下内容:在Matlab工具箱中使用PNG或TIFF而不是JPG,可以提高约3毫米的精度。 正如您所说,“...相机坐标系,其原点位于相机外壳内部...”这给了我正确的结果。 在300mm和1500mm之间进行的各种测试给出的精度不超过约3mm(使用卷尺)。 最重要的是,棋盘格块的大小是用卡尺测量的,这也减少了约5mm,即使它只从25mm到25.3mm,这是有道理的。 非常感谢您的帮助Dima。 - Grim
显示剩余2条评论

3

虽然这三个应用程序大多依赖相同的算法(甚至共享作者),但由于它们有不同的实现和表现,它们之间的差异并不令人惊讶。如果您希望进行公正的比较,您至少应该使用相同的测量数据(例如检测到的角点位置,并进行亚像素优化),以便任何输出差异都纯粹是由实现造成的。已经指出,通过使用不同的图像格式,您实际上使用了不同的测量集。

您观察到的主点变化也并不令人惊讶:由于

  • 重投影误差对其位置不太敏感,即您试图优化的损失函数在(cx,cy)子空间中大多数情况下是“平坦”的(请参阅本文中的详细讨论),并且
  • 它在本质上与非线性畸变的中心和世界到相机翻译的图像平面平行分量混淆。

后一点意味着主点中的微小难以检测的变化将导致3D位置误差显著,除非添加附加约束条件,使约束误差函数在量感兴趣的情况下不平坦,即相机相对于校准装置的绝对位置和方向。

便捷的约束条件包括:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接