OpenCV 3.4 相机校准产生奇怪的主点

OpenCV 3.4 camera calibration yields strange principal point

我正在使用 OpenCV 3.4 版本中提供的 calibration.cpp 样本进行相机校准。我使用的是一个简单的 9x6 棋盘,方格长度 = 3.45 毫米。

命令运行代码:

Calib.exe -w=9 -h=6 -s=3.45 -o=camera.yml -oe imgList.xml

imgList.xml

我正在使用一批可用的 28 张图像 here

camera.yml(输出)

drawChessboardCorners 的图像输出:here

有 4 张图像没有绘制棋盘覆盖图,findChessboardCorners 对这些图像失败。

结果看起来有点奇怪(如果我理解正确的话)。我认为焦距值是理所当然的,但主要观点似乎偏离 c = (834, 1513)。我期待一个更接近图像中心 (1280, 960) 的点,因为相机与所观察表面的方向非常接近 90 度。

此外,如果我将一个对象放在主点并沿 Z 轴移动它,我不应该看到它在图像中沿 x 和 y 移动,这是否正确?

我怀疑我应该添加棋盘相对于相机倾斜度更大的图像以获得更好的结果(z 角)。但是相机的景深真的很窄,这使得棋盘角无法被检测到。

您遇到的主要问题是您没有向相机软件提供足够的信息来正确估计不同的参数。

在所有 28 张图像中,您仅更改了棋盘在同一平面内围绕 z 轴的方向。你不需要拍那么多照片,对我来说15张左右就可以了。您需要向图像添加更多 ddl:更改棋盘与相机的距离并围绕其 X 轴和 Y 轴倾斜棋盘。重新校准相机,你应该得到正确的参数。

这真的取决于你使用的相机和镜头。 更具体地说:

  • 芯片部署精度
  • 镜头螺纹附件
  • 镜头本身制造

一些廉价的小芯片网络摄像头甚至可以将图像大小作为主点(意味着它也可以是负数)。所以在你的情况下 C 可以是 - (834,1513) 或 (1513,834)。 如果您使用工业凸轮或类似的东西,C 应该在图像中心周围百分之几十的范围内 -> 例如(1280,960)+-25%。

关于窄 DOF 的问题(简而言之)- 要使其变宽,您需要使光圈尽可能小,延长曝光时间并在相机后面添加一些额外的光线以补偿光圈。 您也可以重新对焦以从不同的距离获得清晰的照片,只是您的准确度会降低,因为重新对焦会稍微改变焦距。但在大多数情况下,您不需要这种超级超高精度,所以这应该不是问题。