【问题标题】:OpenCV 3.4 camera calibration yields strange principal pointOpenCV 3.4 相机校准产生奇怪的主点
【发布时间】:2018-07-15 17:12:05
【问题描述】:

我正在使用 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 角)。但是相机的景深非常窄,这会阻止检测到棋盘角。

【问题讨论】:

  • 真的是 (834,1513) vs. (1280,960) 还是 (1513,834) vs. (1280,960)?如果 thr first 是这种情况,也许您的校准图像坐标交换了 x 和 y 坐标?
  • 一定是第一种情况。否则,相机矩阵没有多大意义。我也尝试了 -w=6 -h=9 并且相机矩阵看起来非常相似。 PS:编辑帖子添加calibration.cpp链接

标签: c++ opencv camera-calibration calibration


【解决方案1】:

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

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

【讨论】:

  • 您认为它可以与较小的棋盘一起使用吗?大约是我在图片中使用的那个大小的一半。
  • 具有相同数量的角?是的,它也有效,尽可能多的角落你有更好的。你已经拥有的那个很好
  • 我知道已经很久了。我接受您的回答,因为它通常朝着正确的方向发展。在某些情况下,我仍然会得到距离图像中心约 100-200 像素的主点。但是当我使用 projectPoints 将 3D 点映射到 2D 时,结果很好。
【解决方案2】:

这实际上取决于您使用的相机和镜头。 更具体地说,例如:

  • 芯片部署精度
  • 镜头螺纹连接
  • 镜头本身的制造

一些带有小芯片的廉价网络摄像头甚至可能会超出图像大小的主要点(这意味着它也可能是负数)。因此,在您的情况下,C 可以是 - (834,1513) 或 (1513,834)。 如果您使用的是工业相机或类似的东西,C 应该在图像中心周围百分之十的范围内 -> 例如(1280,960)+-25%。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2013-01-28
    • 2014-10-23
    • 1970-01-01
    • 2012-04-18
    • 2016-12-29
    • 2011-08-03
    相关资源
    最近更新 更多