Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv OpenGL透视矩阵的内部相机参数:远近参数?_Opencv_Opengl_Camera Calibration_Perspectivecamera_Pose Estimation - Fatal编程技术网

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

Opencv OpenGL透视矩阵的内部相机参数:远近参数?,opencv,opengl,camera-calibration,perspectivecamera,pose-estimation,Opencv,Opengl,Camera Calibration,Perspectivecamera,Pose Estimation,我正在开发一个增强现实应用程序,将图形叠加到相机图像上。使用OpenCV姿态估计器,以及设备本身的固有相机参数,我能够生成一个非常好的OpenCV相机矩阵和OpenGL透视矩阵,从而产生合理的结果 然而,我的解决方案,以及我在本论坛和其他互联网位置上研究过的所有类似解决方案,只是对透视矩阵近距离和远距离参数使用了一些有点任意的值(通常为1.0和100) 但是,如果感兴趣的对象不是太近,这通常是正常的,但当对象接近视点时,它会变得更不准确,并且是失真的来源 实际上,随着这两个参数(近、远)的调整,

我正在开发一个增强现实应用程序,将图形叠加到相机图像上。使用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=以像素为单位的水平点之间的距离
那么

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

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

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


希望这会有所帮助。

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

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

大多数圆点用于对齐。水平视野可以从中心水平线中最宽的空间点计算得出。垂直视野可以用类似的方式计算。中间的点是a