解析旋转矩阵以获得角度

时间:2014-02-05 06:16:32

标签: c++ opencv computer-vision angle rotational-matrices

我已经使用这个code作为检测场景中矩形目标的基础。我使用ORB和Flann Matcher。我已经能够成功地在场景中绘制检测到的目标的边界框。 findHomography()和perspectiveTransform()函数。
参考图像(上面代码中的img_object)是只有矩形目标的直视图。现在我的场景图像中的目标可能向前或向后倾斜。我想找出它倾斜的角度。我有阅读各种帖子并得出结论,findHomography()返回的单应性可以分解为旋转矩阵和平移向量。我使用的代码来自https:this link推荐的代码转换为C ++。这是从OpenCV的摄像机校准模块得到的张SVD分解代码。我得到了完整的解释这个分解代码来自O'Reilly的Learning OpenCV一书。
我还在匹配器返回的关键点上使用solvePnP()来交叉检查旋转矩阵和从单应性分解返回的平移向量,但它们似乎不相同。
我已经测量了所有场景图像的倾斜度。我找到了两种从旋转矩阵中检索角度的方法,以检查它们与我的值的匹配程度。

  • 给定3×3旋转矩阵

    R =
    [r_ {11}& r_ {12}& r_ {13}]
          [r_ {21}& r_ {22}& r_ {23}]
          [r_ {31}& r_ {32}& r_ {33}]

    3个欧拉角

    theta_ {x} = atan2(r_ {32},r_ {33})

    theta_ {y} = atan2(-r_ {31},sqrt {r_ {32} ^ 2 + r_ {33} ^ 2})

    theta_ {z} = atan2(r_ {21},r_ {11})


  • 轴,角度表示 - R是一般旋转矩阵,其对应的旋转轴u 旋转角θ可以从以下方式检索:
    cos(θ)=(trace(R) - 1)/ 2
    [u]×=(R - R⊤)/ 2 sin(θ)


我使用从单应性分解和solvepnp()获得的旋转矩阵的两种方法计算角度。所有角度都不同,并给出非常意外的值。
我的理解是否有漏洞?我不明白我的计算错误在哪里。我可以使用任何替代方案吗?

1 个答案:

答案 0 :(得分:2)

为什么你期望它们是一样的?它们根本不是一回事。

欧拉角是从世界框架开始一次绕一个轴旋转的三个角度。

Rodriguez的公式给出了世界框架中一个向量的分量,以及围绕该向量的旋转角度。