2

我已将此代码用作在场景中检测我的矩形目标的基础。我使用 ORB 和 Flann Matcher。我已经能够使用 findHomography() 和 perspectiveTransform() 在我的场景中成功绘制检测到目标的边界框功能。
参考图像(上面代码中的img_object)是仅矩形目标的直视图。现在我的场景图像中的目标可能向前或向后倾斜。我想找出它倾斜的角度。我有看了各种帖子,得出的结论是findHomography()返回的单应性可以分解为旋转矩阵和平移向量。我使用了此链接推荐的 https://gist.github.com/inspirit/740979 中的代码翻译成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()获得的旋转矩阵的方法计算了角度。所有的角度都是不同的,并且给出了非常意想不到的值。
我的理解有漏洞吗?我不明白我的计算在哪里错了。我可以使用其他替代方法吗?

4

1 回答 1

3

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

欧拉角是一次围绕一个轴的三个旋转角,从世界坐标系开始。

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

于 2014-02-06T15:33:03.280 回答