1

我正在开发一个将图形叠加到相机图像上的增强现实应用程序。使用 OpenCV Pose Estimator 和设备本身的 Intrinsic Camera Parameters,我能够生成一个相当不错的 OpenCV Camera Matrix 和 OpenGL Perspective Matrix,从而产生合理的结果。

然而,我的解决方案,以及我在这个论坛和其他 Internet 位置检查过的所有类似解决方案,只是对透视矩阵近距和远距参数使用一些有些随意的值(通常为 1.0 和 100)。

然而,虽然如果感兴趣的对象不太靠近,这通常是可以的,但当对象靠近视点时,它会变得更加不准确并且是失真的来源。

实际上,随着这两个参数(近、远)的调整,透视的消失点会发生变化。

有没有人有更合理的方法来从可用数据中推导出 Near 和 Far 参数?

4

2 回答 2

5

近平面和远平面对透视没有影响。它们只会更改前后剪裁平面的放置位置。

您可以通过查看典型的投影矩阵来说服自己就是这种情况。使用定义:

  • asp: 纵横比。
  • t2:半视角的切线。
  • n: 近距离。
  • f: 远距离。

那么投影矩阵为:

    [ 1 / (asp * t2)  0       0                  0                   ]
P = [ 0               1 / t2  0                  0                   ]
    [ 0               0       (n + f) / (n - f)  2 * n * f / (n - f) ]
    [ 0               0       -1                 0                   ]

将此应用于向量给出:

    [ x ]   [ x / (asp * t2)                      ]
P * [ y ] = [ y / t2                              ]
    [ z ]   [ (z * (n + f) + 2 * n * f) / (n - f) ]
    [ 1 ]   [ -z                                  ]

透视分割后的向量为:

[ x / (-z * asp * t2)                  ]
[ y / (-z * t2)                        ]
[ -(n + f + (2 * n * f) / z) / (n - f) ]
[ 1                                    ]

如您所见,结果向量的xy分量,它决定了顶点在窗口中的位置(或者更准确地说,在 NDC 空间中),不依赖于近距和远距的值。near 和 far 值仅控制眼睛空间中的 z 坐标到 NDC 空间中的 z(深度)值的映射。

于 2014-12-30T04:38:49.337 回答
1

从您在上面的评论中发布的图像中可以看出,您的相机内在参数通常是不正确的,尤其是您的视野不正确。有几种估计相机参数的数值方法。但是,它们的准确性会随着复杂性的增加而降低。

如果您只想知道视野,您可以通过创建一个由 3x3 小而均匀分布的点组成的目标来计算它。目标应该足够大,以填充您将要工作的范围内的大部分图像。如果您有一个小目标,只要它仍在焦点上,您就可以将相机移近一点。这些点应该相对较小,以便在手动操作时可以准确估计中心的位置。如果您使用计算机程序估计它们的位置,则应使用较大的点。

大多数点用于对齐。水平视野可以从中心水平线上最宽的空间点计算出来。可以以类似的方式计算垂直视野。应使用中心和角上的点来确保相机图像平面居中并与目标平行。(如果很难让点与图像的行和列对齐,您可能需要更复杂的相机模型。)

一旦设置了目标,就可以计算水平视野。

  • 让 Z = 到目标的距离(以米为单位)。
  • 令 D = 以米为单位的水平点之间的距离。
  • 令 w = 图像宽度(以像素为单位)。
  • 设 x = 水平点之间的距离(以像素为单位)。

然后,

HFOV = 2 * arctan((D * (w / x) / 2) / Z)。

类似的计算适用于垂直视野。

早在 90 年代,我们就使用这种简单的方法来校准 DARPA 无人地面车辆项目中的相机,并且效果很好。

希望有帮助。

于 2015-06-17T02:30:23.550 回答