OpenGL 透视矩阵的固有相机参数:近远参数?

And*_*eve 1 opengl opencv perspectivecamera camera-calibration pose-estimation

我正在开发一个增强现实应用程序,将图形叠加到相机图像上。使用 OpenCV Pose Estimator 和设备本身的固有相机参数,我能够生成一个非常好的 OpenCV 相机矩阵和 OpenGL 透视矩阵,从而产生合理的结果。

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

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

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

有谁有更合理的方法来从可用数据中推导出近参数和远参数?

Ret*_*adi 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                   ]
Run Code Online (Sandbox Code Playgroud)

将其应用于向量可以得出:

    [ x ]   [ x / (asp * t2)                      ]
P * [ y ] = [ y / t2                              ]
    [ z ]   [ (z * (n + f) + 2 * n * f) / (n - f) ]
    [ 1 ]   [ -z                                  ]
Run Code Online (Sandbox Code Playgroud)

透视除法后的向量为:

[ x / (-z * asp * t2)                  ]
[ y / (-z * t2)                        ]
[ -(n + f + (2 * n * f) / z) / (n - f) ]
[ 1                                    ]
Run Code Online (Sandbox Code Playgroud)

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