如何从旋转矩阵计算角度
c++
computer-vision
opencv
5
0

我正在使用单个对象的两个图像,该对象从其第一个图像旋转了一定程度。

我已经计算了每个图像的姿势,并使用Rodergues()将旋转向量转换为矩阵。现在如何计算并查看其从第一个位置旋转了多少?

我已经尝试了很多方法,但是答案都还很接近

编辑:我的相机是固定的,只有物体在移动。

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

如果R是(3x3)旋转矩阵,则旋转角度将为acos((tr( R )-1)/ 2),其中tr( R )是矩阵的迹线(即对角元素的总和) )。

那就是你要的;我估计有90%的机会不是您想要的。

收藏
评论

我们可以使用以下公式从旋转矩阵获得欧拉角。

给定3×3旋转矩阵

在此处输入图片说明

3个欧拉角是

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

这里的atan2是相同的反正切函数,带有象限检查,通常在C或Matlab中找到。

注意:如果围绕y轴的角度恰好为+/- 90°,则必须小心。在这种情况下,除了左下角的1或-1之外,第一列和最后一行中的所有元素都将为0(cos(1)= 0)。一种解决方案是将围绕x轴的旋转固定为180°,并根据以下公式计算围绕z轴的角度:atan2(r_12,-r_22)。

另请参阅https://www.geometrictools.com/Documentation/EulerAngles.pdf ,其中包括六种不同阶数的欧拉角的实现。

收藏
评论

供您参考,该代码在MATLAB中计算欧拉角:

function Eul = RotMat2Euler(R)

if R(1,3) == 1 | R(1,3) == -1
  %special case
  E3 = 0; %set arbitrarily
  dlta = atan2(R(1,2),R(1,3));
  if R(1,3) == -1
    E2 = pi/2;
    E1 = E3 + dlta;
  else
    E2 = -pi/2;
    E1 = -E3 + dlta;
  end
else
  E2 = - asin(R(1,3));
  E1 = atan2(R(2,3)/cos(E2), R(3,3)/cos(E2));
  E3 = atan2(R(1,2)/cos(E2), R(1,1)/cos(E2));
end

Eul = [E1 E2 E3];

代码由Graham Taylor,Geoff Hinton和Sam Roweis提供。有关更多信息,请参见此处

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号