Opencv OpenGL透视矩阵的内部相机参数:远近参数?
我正在开发一个增强现实应用程序,将图形叠加到相机图像上。使用OpenCV姿态估计器,以及设备本身的固有相机参数,我能够生成一个非常好的OpenCV相机矩阵和OpenGL透视矩阵,从而产生合理的结果 然而,我的解决方案,以及我在本论坛和其他互联网位置上研究过的所有类似解决方案,只是对透视矩阵近距离和远距离参数使用了一些有点任意的值(通常为1.0和100) 但是,如果感兴趣的对象不是太近,这通常是正常的,但当对象接近视点时,它会变得更不准确,并且是失真的来源 实际上,随着这两个参数(近、远)的调整,透视图的消失点会发生变化Opencv OpenGL透视矩阵的内部相机参数:远近参数?,opencv,opengl,camera-calibration,perspectivecamera,pose-estimation,Opencv,Opengl,Camera Calibration,Perspectivecamera,Pose Estimation,我正在开发一个增强现实应用程序,将图形叠加到相机图像上。使用OpenCV姿态估计器,以及设备本身的固有相机参数,我能够生成一个非常好的OpenCV相机矩阵和OpenGL透视矩阵,从而产生合理的结果 然而,我的解决方案,以及我在本论坛和其他互联网位置上研究过的所有类似解决方案,只是对透视矩阵近距离和远距离参数使用了一些有点任意的值(通常为1.0和100) 但是,如果感兴趣的对象不是太近,这通常是正常的,但当对象接近视点时,它会变得更不准确,并且是失真的来源 实际上,随着这两个参数(近、远)的调整,
是否有人有更可靠的方法从可用数据中导出近距离和远距离参数?近距离和远距离平面对透视图没有影响。它们仅更改前后剪裁平面的放置位置 通过查看一个典型的投影矩阵,您可以说服自己这是一种情况。使用定义:
:纵横比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 ]
如您所见,结果向量的
x
和y
分量决定了顶点在窗口中的位置(或者更准确地说,在NDC空间中),它们不依赖于近距离和远距离的值。“近”和“远”值仅控制眼睛空间中z坐标到NDC空间中z(深度)值的映射。近平面和远平面对透视图没有影响。它们仅更改前后剪裁平面的放置位置
通过查看一个典型的投影矩阵,您可以说服自己这是一种情况。使用定义:
:纵横比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 ]
如您所见,结果向量的
x
和y
分量决定了顶点在窗口中的位置(或者更准确地说,在NDC空间中),它们不依赖于近距离和远距离的值。“近”和“远”值仅控制眼睛空间中z坐标到NDC空间中z(深度)值的映射。从您在上面评论中发布的图像中可以看出,您的固有相机参数总体上不正确,尤其是您的视野不正确。有几种估计摄像机参数的数值方法。然而,随着复杂性的增加,它们的准确性会降低
如果您只想知道视野,可以通过创建一个具有3x3个均匀分布的小点场的目标来计算视野。目标应该足够大,可以在工作范围内填充大部分图像。如果你有一个小目标,你可以移动相机靠近,只要它仍然在焦点上。这些点应该相对较小,这样你就可以用手准确地估计中心的位置。如果你使用计算机程序估计它们的位置,应该使用较大的点
大多数圆点用于对齐。水平视野可以从中心水平线中最宽的空间点计算得出。垂直视野可以用类似的方式计算。应使用中心和角落中的点来确保相机图像平面居中且平行于目标。(如果很难使点与图像的行和列对齐,则可能需要更复杂的相机模型。)
设置目标后,即可计算水平视野
- 设Z=距离目标的距离,单位为米李>
- 设D=水平点之间的距离,单位为米
- 设w=图像的宽度(以像素为单位)
- 设x=以像素为单位的水平点之间的距离
希望这会有所帮助。从您在上面评论中发布的图像中可以看出,您的固有相机参数总体上不正确,尤其是您的视野不正确。有几种估计摄像机参数的数值方法。然而,随着复杂性的增加,它们的准确性会降低 如果您只想知道视野,可以通过创建一个具有3x3个均匀分布的小点场的目标来计算视野。目标应该足够大,可以在工作范围内填充大部分图像。如果你有一个小目标,你可以移动相机靠近,只要它仍然在焦点上。这些点应该相对较小,这样你就可以用手准确地估计中心的位置。如果你使用计算机程序估计它们的位置,应该使用较大的点 大多数圆点用于对齐。水平视野可以从中心水平线中最宽的空间点计算得出。垂直视野可以用类似的方式计算。中间的点是a