似乎有 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关于 x、y 和 z 轴。因此,如果“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/