c++ - 将 OpenCV 旋转和平移 vector 转换为 XYZ 旋转和 XYZ 位置

标签 c++ opencv rotation rotational-matrices

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

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

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

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

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

编辑: 这是从solvePnP()返回的旋转 vector 和平移 vector 的示例...转换为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>

最佳答案

最初我对 OpenCV 使用什么格式一无所知。所以先研究一下。看the documentation for solvePnP ,它看起来像它返回一个矩阵。 (文档 appears 中旧版本中提到的 Rodrigues2 函数现在被称为 Rodrigues。)

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

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

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

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

关于c++ - 将 OpenCV 旋转和平移 vector 转换为 XYZ 旋转和 XYZ 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13823296/

相关文章:

c++ - Qt中解析Asterix,为什么需要类型转换?

ios - 从图像中删除背景并仅将图像部分保存在 iOS 中

python - 如何更改此 python 行以使其读取其最新时间戳的图像而不说明特定的图像名称?

c++ - 在 OpenGL 4.0 中是否有围绕局部坐标(即从模型 View 矩阵)旋转的标准方法?

java - 如何在 android/java 中使用矩阵移动和旋转 Canvas 中的位图?

c++ - 如何调用在方法中接收对象的非成员函数

c++ - g++ 警告 "will be initialized after",无论实际顺序如何

c# - 如何使 OpenCV Detect 方法线程安全?

ios - Cocos2D 自动化旋转 90 度

c++ - 无法从文件中读取 unicode(日语)