代码之家  ›  专栏  ›  技术社区  ›  dimart.sp

从OpenGL获取相机矩阵

  •  2
  • dimart.sp  · 技术社区  · 8 年前

    我使用OpenGL渲染3D网格模型 透视照相机 gluPerspective(视点、方位、近、远)。

    然后我在计算机视觉算法中使用渲染图像。

    在某种程度上,算法需要摄像机矩阵 K (以及模型上的几个顶点及其相应的投影)以估计相机位置:旋转矩阵 R 和平移向量 .我可以使用任何解决透视n点问题的算法来估计R和t。

    我构造 K 从OpenGL投影矩阵(查看如何 here )

    K =[fX,0,pX|0,fY,pY|0,0,1]

    如果我想“手动”投影模型点,我可以计算:

    X_proj = K*(R*X_model + t) x_pixel = X_proj[1] / X_proj[3] y_pixel = X_proj[2] / X_proj[3]

    无论如何,我用PnP算法传递这个相机矩阵,它工作得很好。


    但后来我不得不将透视投影改为 正交的 一 据我所知,当使用正交投影时,相机矩阵将变成:

    K = [1, 0, 0 | 0, 1, 0 | 0, 0, 0]

    所以我把gluPerspective改为 glOrtho公司 .遵循我构建的相同方法 K 结果发现fX和fY不是1,而是0.0037371。这是缩放的正交投影还是什么?

    此外,为了“手动”投影模型顶点,我设法做到了以下几点:

    X_proj = K*(R*X_model + t) x_pixel = X_proj[1] + width / 2 y_pixel = X_proj[2] + height / 2

    这不是我所期望的(宽度和高度加2似乎很奇怪……)。我试图将这个相机矩阵传递给POSIT算法来估计R和t,但它没有收敛(

    下面是我的问题:

    1. 如何从OpenGL获取正交相机矩阵?
    2. 如果我这样做是正确的,那么它是真正的正字法吗?为什么POSIT不起作用?
    1 回复  |  直到 8 年前
        1
  •  1
  •   Kamyar Infinity    8 年前

    正交投影不会使用深度缩小更远的点。尽管如此,它将缩放点以适应 NDC 这意味着它将缩放值以适应范围[-1,1]。 此矩阵来自 Wikipedia 显示了这意味着什么:

    Orthographic Projection

    因此,使用1以外的数字是正确的。

    对于您手工计算的方式,我认为这并不是缩小到屏幕坐标,这是错误的。正如我所说,投影矩阵的输出将在范围[-1,1]内,如果您想获得像素坐标,我认为您应该做类似的事情:

    X_proj = K*(R*X_model + t)
    x_pixel = X_proj[1]*width/2 + width / 2
    y_pixel = X_proj[2]*height/2 + height / 2
    

    无论如何,我认为如果您使用现代OpenGL和以下库会更好 GLM 在这种情况下,您手头有精确的投影矩阵。