我已经使用这个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})
我使用从单应性分解和solvepnp()获得的旋转矩阵的两种方法计算角度。所有角度都不同,并给出非常意外的值。
我的理解是否有漏洞?我不明白我的计算错误在哪里。我可以使用任何替代方案吗?
答案 0 :(得分:2)
为什么你期望它们是一样的?它们根本不是一回事。
欧拉角是从世界框架开始一次绕一个轴旋转的三个角度。
Rodriguez的公式给出了世界框架中一个向量的分量,以及围绕该向量的旋转角度。