首页 > 解决方案 > opengl查找矩阵到相机外在矩阵

问题描述

我正在尝试从我从 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 矩阵,但这也不起作用。融合模型快照如下所示

在此处输入图像描述

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

标签: c++openglcomputer-visionglm-mathphotogrammetry

解决方案


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


推荐阅读