【发布时间】: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