gpt4 book ai didi

opengl - 相机标定 : aspect ratio different from image aspect ratio. 如何校正?

转载 作者:太空宇宙 更新时间:2023-11-03 23:02:46 31 4
gpt4 key购买 nike

我一直在我的 OpenCV 和 OpenGL 组件之间来回切换,我不确定这两者中的哪一个应该更正这个问题。

使用 OpenCV 相机校准产生 fx、fy,纵横比大约为 1,这对应于正方形大小的图像。我的校准输出:

...
image_width: 640
image_height: 480
board_width: 6
board_height: 9
square_size: 5.
flags: 0
camera_matrix: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [ 6.6244874649105122e+02, 0., 3.4060477796553954e+02,
0., 6.4821741696313484e+02, 2.5815418044786418e+02,
0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
rows: 5
cols: 1
dt: d
data: [ -1.1832005538154940e-01, 1.2254891816651683e+00, 3.8133468645674677e-02, 1.3073747832019200e-02, -3.9497162757084490e+00 ]

但是,正如您在校准输出中看到的那样,我的图像宽度为 640x480。

当我在框架中检测到棋盘并使用 OpenGL 绘制棋盘时,OpenGL 在高度上呈现正常但在宽度方向上拉伸(stretch),因此它不适合棋盘的实际位置。肯定能解决它的是将校准的 fx 分量乘以 480/640,但我不知道这是否可行。

我该如何纠正这个问题?使用图像大小缩放校准值,或者在 OpenGL 中做一些事情来修复它?

编辑

捕捉和展示是有区别的。我使用经过校准的智能手机捕捉图像,该智能手机输出 640x480 的图像。

为了找到棋盘,我使用了如上所示的内部函数,它们已经过校准。

那么,不管我给OpenGL的宽高比是fx/fy,640/480还是fx/fy * 640/480,都是错误的。在 OpenGL 中投影回来的棋盘,OpenGL 投影回来的东西在宽度方向上被拉伸(stretch)。

它在 OpenGL 中看起来完全正确的唯一方法是,如果我使用 fx=640,fy=480 寻找棋盘。这也是错误的,因为现在我完全忽略了相机的内在特性……enter image description here

编辑2

我的意思是,无论我如何设置传递给 gluPerspective 的纵横比,结果都不正确。

gluPerspective( /* field of view in degree */ m_fovy,
/* aspect ratio */ 1.0/m_aspect_ratio,
/* Z near */ 1.0, /* Z far */ 1000.0);

我对 m_aspect_ratio 值的尝试:

  • OpenCV 的 calibrationMatrixValues 的输出纵横比
  • 外汇/外汇
  • 640/480
  • 外汇/全年 * 640/480
  • 校准矩阵值的输出 * 640/480

所有似乎都在搞砸宽度。请注意,在我的屏幕截图中,棋盘的原点是图像中最上层的内角:它放置正确,图像中最下层的内角也是如此。这是一个缩放问题..

编辑3

这真的非常愚蠢。我正在为 OpenGL 设置纵横比:

gluPerspective( /* field of view in degree */ m_fovy,
/* aspect ratio */ 1.0/m_aspect_ratio,
/* Z near */ 1.0, /* Z far */ 1000.0);

和设置

m_aspect_ratio = viewportpixelheight / viewportpixelwidth;

没有意识到 viewportpixelheightviewportpixelwidth 是整数,所以我正在做整数除法,结果要么是 1,要么(交换它们时)是 0。

最佳答案

相机校准矩阵将世界坐标映射到图像坐标。 OpenGL 将图像坐标映射到屏幕坐标。如果您的问题在于图像的显示方式,您应该在 OpenGL 中处理它。

对于造成的困惑,我深表歉意。我试图做的是区分捕获和显示图像。你是正确的,物理相机的宽高比可以从焦距计算出来。这些焦距和宽高比由相机的硬件固定。一旦您捕获了该图像,您就可以自由地以您使用 OpenGL 选择的任何宽高比显示它。您可以随心所欲地裁剪和拉伸(stretch)图像,以更改显示内容的纵横比。相机的宽高比不一定与屏幕的宽高比相匹配。 OpenCV 使用来自物理相机的直接原始测量值来计算相机校准矩阵。如果我们假设它们是正确且不变的(如果没有缩放,这两者似乎都是合理的),那么纵横比的任何进一步变化都是 OpenGL 的责任。当我说 fx 和 fy 不能确定宽高比时,我指的是显示的宽高比,它根本不是很清楚,我很抱歉。

另外,我应该提一下,您可以根据焦距计算纵横比的原因是焦距以像素为单位表示,而这些单位在 x 轴和 y 轴上可能不同。可以找到简要说明here

我找到的关于相机矩阵中焦距的最佳解释是在 Computer Vision Algorithms and Applications 的相机内在部分。 .在 pdf 中,它从书的第 72 页、第 50 页开始。

关于opengl - 相机标定 : aspect ratio different from image aspect ratio. 如何校正?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13196893/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com