17

似乎有 Google 结果和 stackoverflow 帖子可以回答这个问题,但简单的事实是我无法理解它们。无论我读了多少,我都无法理解四元数、欧拉角和罗德里格斯变换等等。

有人愿意像我 12 岁那样向我解释如何从 OpenCV 的 solvePnP() 方法返回的旋转和平移向量中获取我可以插入 3d 图形应用程序的 xyz Position 和 xyz Rotation 值吗?

这是用于 C++ 中的增强现实应用程序。我已经启动并运行了 OpenCV 部分,跟踪标记板并将旋转和平移矢量发送到图形程序,但我不知道如何使用这些信息来设置我的 3d 对象。

我真的很想了解这背后的数学原理,并会感谢这里对理论的任何耐心解释。但我也会接受指向一些代码的指针,我可以在另一天复制/粘贴并学习理论。事实上,通过查看具体代码并回归理论,我似乎可以更快地学习这样的东西。

编辑:就像有这个......这显然应该为我指明正确的方向,但据我所知,它也可能是时间机器的计划。我突然想到我可能会要求补习高中数学,但这不可能是第一次。

编辑:这是从solvePnP()返回的旋转向量和平移向量的示例...转换为XML以用于图形应用程序。请注意,我看到的每一个都包含三行一列。

<Tvec type_id="opencv-matrix">
  <rows>3</rows>
  <cols>1</cols>
  <dt>f</dt>
  <data>
    -2.50094433e+01 -6.59909010e+00 1.07882790e+02
  </data>
</Tvec>
<Rvec type_id="opencv-matrix">
  <rows>3</rows>
  <cols>1</cols>
  <dt>f</dt>
  <data>
    -1.92100227e+00 -2.11300254e-01 2.80715879e-02
  </data>
</Rvec>
4

3 回答 3

17

最初我对 OpenCV 使用什么格式一无所知。所以先研究一下。查看的文档solvePnP,它似乎返回了一个矩阵。(这些天似乎调用Rodrigues2了文档中旧版本中提到的函数。)Rodrigues

那里的描述表明您可以期望一个具有单行或单列的矩阵。该向量的方向表示旋转轴,而向量的长度(或“范数”)表示角度。

所以你的输入是角度轴表示。您可以将其解释为同时围绕xyz旋转。因此,如果“XYZ 旋转”是指同时旋转,那么您已经在那里了。但是,如果您的意思是某个组合首先围绕x轴旋转,然后围绕y轴旋转,然后围绕z轴旋转,那么您处于一个奇怪的设置中,并且可能应该确保您使用的是正确的 API。

如果你追求的是欧拉角,那么称它们为“XYZ 旋转”有点误导。Wikipedia 文章Rotation forms in three dimensions列出了各种格式,以及如何在它们之间进行转换。特别是,它确实给出了从轴和角度转换为矩阵以及从那里转换为欧拉角的公式。

确保您使用正确的表示来匹配您的图形输出机器。或者,如果您有选择,请尝试直接处理旋转矩阵表示,因为这应该是最容易理解和使用的。

于 2012-12-11T16:37:20.067 回答
2
  1. 将您的 3D 矢量扩展到齐次坐标 (4D)。这意味着具有分量 (X, Y, Z, 1) 的 4D 矢量

  2. 根据您的旋转和平移参数创建一个 4x4 变换矩阵。它被称为仿射变换。关于旋转矩阵的文章,您走在了正确的轨道上。

  3. 将坐标向量与变换矩阵相乘。

查看此维基百科部分:http ://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations

它有一个在 2d 坐标中构成的示例,我相信您已经足够了解将其扩展到 3d 的想法。

于 2012-12-11T16:36:55.820 回答
2

我的猜测是 OpenCv 已经返回 XYZ 旋转。拿起你的左手(左手法则)并握紧你的拳头。竖起拇指(z 轴),将食指伸直向前(x 轴),然后将中指向右伸(y 轴)。

任何特定的方向向量最多可以通过三个旋转来给出。重要的是要意识到您可以获得等效的旋转。例如,围绕 z 轴旋转,使您的索引指向您的右侧。等效旋转将是 Y,X,然后是 Y,而不涉及 Z 轴。

但是,当您使用完整的旋转矩阵 (3x3) 时,您不必担心这些约定,因为它们都在矩阵中合并在一起。这就是您链接的论文的内容,而不是时间旅行,这是幸运的,因为大多数数学专业的学生都能够进行时间旅行,从而注定了人类的命运。

然而,旋转矢量通常是指您的对象必须围绕空间中的哪个矢量旋转。

于 2012-12-11T20:31:59.720 回答