opencv - 使用单应性估计摄像机角度
问题描述
我一直在尝试从两帧之间的单应性估计无人机的欧拉角 (Rotz(yaw)*Roty(pitch)*Rotx(roll))。这意味着我从每一帧到前一帧的旋转必须乘以前一帧才能获得相对于初始轴的总旋转。所以: R_accumulated=R01*R12*... 这些 R 是从 openCV 中的 decomposeHomography() 获得的。根据 REP 和 OpenCV 单应性页面,相机参考是 Z 向前,X rigth 和 Y 向下,但我的 UAV 参考系统是 ENU。问题是如何从 R_accumulated dron 方向中获得。
单应性的 R_accumulated 告诉您如何将一个平面转换为另一个平面。所以如果我想要相机方向,相机必须做相反的运动才能得到相同的结果(inv(R_accumulated))?那么应该将相机方向矩阵转换为 ENU 坐标吗?我已经尝试过几次旋转,但我没有得到好的结果。
我所拥有的最好的方法是直接从 R_accumulated 获取角度并交换俯仰和滚动。这是一个很好的估计,但我仍然需要知道从相机框架到无人机框架的某种旋转矩阵。
我不知道你是否理解我。
解决方案
最后,我有解决我的问题的方法:
如果 UAV 轴与相机的轴不同,我们必须找到一个矩阵 R1,将 UAV 轴转换为相机轴,另一个执行相同任务的矩阵,从相机轴到 UAV 轴,R2。
单应性返回应该应用于第一个 PICTURE 以获得第二个 PICTURE 的平移和旋转的值。但我们想要的是相机姿势,而不是照片。因此,例如,如果 z 轴指向具有向上箭头的对象,则 IMAGE 围绕该前向轴旋转 90º 将使箭头指向正确。但这不是相机必须做的旋转才能使箭头指向正确。如果您希望箭头指向右侧,则必须将相机沿同一轴旋转 -90º。总之,相机运动是图像的倒数,因此相机旋转将是单应性旋转的倒数,并且平移将为 -1*(homography_traslation) * scale_factor。
假设我们在初始图像和最终图像之间有一个旋转 R。如果我们想得到无人机的欧拉角(最好叫Tait-Brian)为Rotz * Roty * Rotx,我们必须计算R1 * inv(R) * R2的EulerAngles。R 是帧之间所有中间旋转的乘积,因此 R = Rinit * ... * Rend
推荐阅读
- azure-devops - 使用 Azure DevOps REST Api 的用户名和密码从 Azure AD 获取访问令牌
- java - 在 Spring Boot 中编写单元测试,但由于转换器类而出错
- r - 在 R 中使用 4 路数组中的数据创建成对散点图
- datagrip - 编译时如何避免 Datagrip 控制台中的代码
- python - NumPy - 获取表示边界框的数组边界
- node.js - Azure 机器人服务 SDK 是否需要 restify?(节点)
- python - 从熊猫数据框中返回值
- jquery - 如何将新选项附加到选择元素,但在声明时保持新选项项的顺序
- c# - 如何将 int 传递给 IEnumerable?
- azure - ARM 模板 - 在 Concat 函数中引用资源属性