OpenGL透视矩阵的内在相机参数:近远参数?

时间:2014-12-30 03:05:55

标签: opencv opengl camera-calibration perspectivecamera pose-estimation

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

但是,我的解决方案以及我在此论坛和其他互联网位置上检查的所有类似解决方案,只是对Perspective Matrix Near和Far Parameters使用了一些有些任意的值(通常为1.0和100)。 p>

然而,如果感兴趣的物体不是太近,这通常是正常的,当物体接近视点时,它变得更不准确并且是失真的来源。

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

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

2 个答案:

答案 0 :(得分:3)

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

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

  • 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(深度)值的映射。

答案 1 :(得分:0)

从您在上述评论中发布的图片中可以看出,您的内在相机参数,特别是您的视野特别不正确。有几种估算摄像机参数的数值方法。然而,它们的准确性随着复杂性的增加而降低。

如果您只是想知道视野,可以通过创建一个3x3小的均匀间隔点的目标来计算它。目标应足够大,以填充您工作范围内的大部分图像。如果您的目标很小,只要它仍处于焦点位置,您就可以将相机移近。这些点应该相对较小,以便您可以手动估算中心的位置。如果您使用计算机程序估算其位置,则应使用较大的点。

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

设置目标后,可以计算水平视野。

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

然后,

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

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

在90年代,我们使用这种简单的方法在DARPA无人地面车辆项目上校准我们的摄像机,并且运行良好。

希望有所帮助。