首页 > 解决方案 > OpenCV 相机校准矩阵与 OpenGL 投影矩阵之间的相关性

问题描述

我很难渲染一个具有相同尺寸和比例的 .stl 模型,在真实对象的图片中可视化。我将真实物体放在视图区域的中心,我想在模型和真实物体之间翻转(真实物体比模型中的一个小 9 倍)。

首先,我在教程中使用 OpenGL 校准相机,此时焦点对真实对象是最佳的。在获得 cx、cy、fx 和 fy 值后,我使用这些值创建一个透视矩阵,并使用 glMultMatrixd 函数。最后,我将照片调整为与我的 OpenGL 窗口相同的大小,并将照片与渲染模型进行比较。

但我对结果有一些问题:

  1. 有比例失真(比高宽)
  2. 存在透视失真(相机与物体垂直,所以我应该只查看物体的顶部,但它显示的是物体的侧面)
  3. 尺寸与实物不符(稍小)

我的关系矩阵如下:

GLdouble perspMatrix[16] = { fx / cx,     0   ,   0    ,    0,
    0,   fy / cy ,   0    ,    0,
    0,     0   ,  -(znear + zfar) / (znear - zfar), 2 * zfar*znear / (zfar - znear),
    0,     0   ,  -1    ,   0 };

标签: opencvopenglrenderingcamera-calibrationprojection-matrix

解决方案


OpenGL 需要以列优先的内存顺序排列矩阵。您在上面显示的数据结构是按行优先的内存顺序(正常的写入顺序,OpenCV 也将其用作内存顺序),因此您需要在传递给 OpenGL 之前对其进行转置。

您还构建了一个对称的视锥体(右==左==cx 和上==下==cy),它假设光轴(cx,cy)位于相机成像器的中心。真正的相机从未如此完美,这就是我们必须校准它们的原因。你需要一个不对称的平截头体,使用left==cx、right==(width-cx)等;本指南应该有所帮助。

请注意,在 OpenGL 中,+Y 向上,+Z 位于相机后面(在 OpenCV 中,+Y 向下,+Z 位于相机前面),因此请检查矩阵上的符号。


推荐阅读