2

我正在使用 2 个摄像头进行头部姿势估计项目。对于一个相机系统工作并返回头部相对于每个相机坐标系的旋转矩阵和平移向量。我在 OpenGL 场景中渲染了对象,该对象被旋转和平移以表示头部运动。要显示计算的旋转矩阵和平移向量,我只需使用以下 OpenGL 命令。

glMatrixMode(GL_MODELVIEW);
glLoadMatrixd(pose_matrix);

其中姿势矩阵是由头部的旋转矩阵和平移向量构造的 OpenGL ModelView 矩阵。

现在我正在尝试为 2 个校准的相机执行此操作。当第一个相机丢失了脸部的轨迹但第二个相机估计了头部姿势时,我会显示相对于第二个相机的旋转和平移,反之亦然。我想显示一个 OpenGL 对象并为这两种情况移动它。为此,我需要将姿势矩阵转移到公共坐标系中。

我知道 2 个相机相对于彼此的相对几何形状。我假设其中一个相机是世界坐标系,我通过将第二个相机的位姿矩阵和第二个相机的校准矩阵相对于第一个相机相乘,将第二个相机的头部姿势矩阵转移到第一个相机的框架。当我将此相乘矩阵加载到 OpenGL ModelView 矩阵中时,我得到了错误的结果。当第一台相机捕捉到人脸时,对象正在向右移动,但对于第二台相机,对象被平移和旋转,并且与第一台相机的情况不同。

可能是什么问题呢?也许OpenGL显示部分是错误的或者?

4

1 回答 1

0

安全的默认假设:OpenGL 是正确的,您的代码是错误的。

在没有看到您的代码的情况下,我可以建议您打印您的矩阵并在 Matlab 或 Octave 中使用它们仔细检查数学。

一个常见的错误是忘记默认情况下 OpenGL PRE 将 ROW 向量乘以 modelvie 矩阵(实际上是所有矩阵)。也就是说,它乘以 v_row * M,矩阵以 col-major 顺序存储,而您可能正在考虑将向量视为 COLUMN 的常见数学惯例,并将它们 POST 乘以 M * v_col(存储 M行主要)。

如果您更喜欢使用后一种约定(推荐),请查找GL_ARB_transpose_matrix扩展。

于 2012-10-03T13:48:49.470 回答