将OpenCV旋转和平移向量转换为XYZ旋转和XYZ位置

时间:2012-12-11 15:41:03

标签: c++ opencv rotation rotational-matrices

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

任何人向我解释,就像我是12,如何从OpenCV的solvePnP()方法返回的旋转和平移向量到xyz位置和xyz旋转值,我可以插入到3D图形应用程序中?

这是针对c ++中的增强现实应用程序。我启动并运行OpenCV部件,跟踪标记板并将旋转和平移向量发送到图形程序,但我不知道如何使用该信息来构建我的3d对象。

我确实想要理解这背后的数学,并且会理解这里对理论的任何耐心解释。但是我也会找到一些指向我可以复制/粘贴的代码的指针,并在另一天学习理论。事实上,我似乎通过查看具体的代码并向理论工作倒退来更快地学习这样的东西。

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

编辑: 下面是一个从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>

3 个答案:

答案 0 :(得分:13)

最初我对OpenCV使用的格式一无所知。所以先做一些研究。看the documentation for solvePnP,它似乎返回了一个矩阵。 (如今,文档appears中旧版本中提到的Rodrigues2功能被称为Rodrigues。)

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

因此您的输入位于angle-axis representation。您可以将其解释为关于 x y z 轴的simultaneous rotation。因此,如果通过“XYZ旋转”表示同时旋转,那么您已经在那里了。但是,如果你的意思是某些组合首先绕 x 轴旋转而然后关于 y 轴和然后关于 z 轴,你处于一个奇怪的设置,可能应该确保你使用正确的API。

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

确保使用正确的表示法来匹配图形输出设备。或者,如果您有选择,请尝试直接使用rotation marix表示,因为这应该是最容易理解和使用的。

答案 1 :(得分:2)

  1. 将3D矢量扩展到齐次坐标(4D)。这意味着具有组分(X,Y,Z,1)

  2. 的4D向量
  3. 根据您的旋转和平移参数创建一个4x4变换矩阵。它被称为仿射变换。您正在使用有关旋转矩阵的文章。

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

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

    它有一个以二维坐标为例的例子,我确信你已经有足够的想法扩展到3d。

答案 2 :(得分:2)

我的猜测是OpenCv已经返回XYZ旋转。左手(left hand rule)并闭上拳头。将拇指向上伸展(z轴),将食指伸直(x轴),然后将中指向右(y轴)伸展。

任何特定的方向矢量最多可以旋转三次。重要的是要意识到你可以得到相同的旋转。例如,围绕z轴旋转,使索引指向右侧。等效旋转将是Y,X,然后是Y,而不涉及Z轴。

但是,当您使用完整旋转矩阵(3x3)时,您不必为这些约定而烦恼,因为它们都在矩阵中合并在一起。这就是你所联系的论文,而不是时间旅行,这是幸运的,因为大多数数学专业的学生都能够去旅行,因此会让人类感到沮丧。

旋转矢量通常指的是你的物体必须围绕哪个空间矢量旋转。