【问题标题】:opengl lookup matrix to camera extrinsic matrixopengl查找矩阵到相机外在矩阵
【发布时间】:2021-01-03 21:08:16
【问题描述】:

我正在尝试从我从 opengl 帧缓冲区保存的深度数据中渲染 3D 点云。基本上,对于以 (0, 0, 0) 为中心的渲染模型,我从不同的 n 个视点(已知)获取了不同的深度样本。我成功保存了深度图,但现在我想从这些深度图中提取协调的 x、y、z。为此,我重新将点从图像投射到世界。为了获得世界坐标,我使用以下等式 P = K_inv [R|t]_inv * p. 来计算世界坐标。

为了计算图像内在矩阵,我使用了来自 opengl 相机矩阵的信息,glm::perspective(fov, aspect, near_plane, far_plane)。内在矩阵 K 计算为

在哪里

如果我转换相机原点的坐标(即,没有外部转换 [R|t]),我会得到单个图像的 3D 模型。为了融合多个深度图,我还需要从 OpenGL 观察矩阵 glm::lookat(eye=n_viewpoint_coorinates, center=(0, 0, 0), up=(0, 1, 0))。 extrisnics 矩阵计算如下(参考:http://ksimek.github.io/2012/08/22/extrinsic/

但是当我融合两个深度图像时,它们没有对齐。我认为外在矩阵是不正确的。我也尝试直接使用 glm::lookat 矩阵,但这也不起作用。融合模型快照如下所示

有人可以建议,我的方法有什么问题。是不是外在矩阵错了(我很确定)?

【问题讨论】:

  • 您的公式没有意义。 K 不等同于您用于渲染的 OpenGL 投影矩阵,当您倒置使用它时,它不会从您从深度缓冲区获得的双曲线 Z 值恢复线性深度值,[R|t]_inv 甚至没有存在,因为R 是一个 3x3 矩阵,如果您添加一个平移列t,您会得到一个没有逆矩阵的 3x4 矩阵。你的乘法顺序也没有意义。
  • 在转换之前,我把所有的矩阵都做成了 4x4,这样我就可以做逆和乘法了。

标签: c++ opengl computer-vision glm-math photogrammetry


【解决方案1】:

最后,我设法自己解决了这个问题。我没有在 OpenGL 内部进行转换,而是在 OpenGL 外部进行了转换。基本上,我保持相机恒定并与模型保持一定距离,并对模型进行旋转变换,然后最终在没有观察矩阵(或仅 4x4 单位矩阵)的情况下渲染模型。我不知道为什么使用lookat matrix 没有给我结果,或者可能是由于我遗漏了一些东西。为了将模型反向投影到世界坐标中,我只需要在将模型输入到 OpenGL 之前进行的精确变换的倒数。

【讨论】:

  • 嗨,你能详细解释一下吗?我正在做一些非常相似的事情,但我有点困惑。内在矩阵:你是如何从投影矩阵计算主点坐标的?我看到您可以从窗口尺寸和 fov 中得到 f,但是您是否会忽略主点(假设为 [0,0])和偏斜(假设为 0)?外在矩阵:您是否建议上面的 R(来自ksimek.github.io/2012/08/22/extrinsic)不正确?我看到了一些从 openCV 到 openGL 的信息,但反之则更少,因此欢迎提供任何帮助。谢谢
猜你喜欢
  • 2015-10-17
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多