我已将此代码用作在场景中检测我的矩形目标的基础。我使用 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()获得的旋转矩阵的方法计算了角度。所有的角度都是不同的,并且给出了非常意想不到的值。
我的理解有漏洞吗?我不明白我的计算在哪里错了。我可以使用其他替代方法吗?