c++ - ArUco 姿态估计中的不稳定值
问题描述
我正在尝试使用 Aruco 标记查找相机的方向。从旋转矩阵中提取的欧拉角在某个点之后是不稳定的。随着相机与标记距离的增加,相机的偏航角值只是不稳定的。标记上的“Z”轴翻转。欧拉角是抖动的,每一帧都不一样,需要时间来稳定。如何获得相机和标记之间的偏航角和距离的一些可靠值?我正在尝试通过静态标记找到移动相机的姿势。我实现了solvePnP和solvePnPRansac都产生了不稳定的结果。从estimatePoseSingleMarker转换旋转向量后得到的旋转矩阵 在某种程度上似乎还不错,但失去了稳定性。我该怎么做?谢谢
解决方案
通常,您不会从单个标记中获得准确的相机姿态估计。解决方案是添加更多标记。您可以使用标记板或更稀疏的标记图案。
随着单个标记离相机越来越远,有几个因素会降低标记姿势估计的准确性。
标记的投影尺寸变得更小,像素网格更量化。距离是通过逆透视除法估计的,因此随着距离的增加,它变得不那么准确。
透视失真减少,接近平行投影。在平行投影中,标记有两个同样可行的方向,可以交替返回(参见https://en.wikipedia.org/wiki/Necker_cube)。标记相对于相机的方向也很重要 - 在标记的更垂直视图(正交投影)中,与倾斜视图相比,标记的俯仰和偏航是不明确的。随着距离的减少透视失真会使这种效果变得更糟,并且会导致计算出的相机姿势偏航、俯仰和横向移动。
鉴于标记中的像素数量较少,传感器噪声和量化等小尺度效应变得更加显着,从而降低了帧与帧之间的稳定性并导致抖动。
正如您所发现的,姿势估计在单个标记的特写倾斜视图中工作正常,因为给solvePnP() 的投影点相距很远并且具有很大的透视失真。通过添加更多标记,您始终可以获得solvePnP() 的理想投影点。
推荐阅读
- django - django 项目无法从购物车中删除
- python - 在根值范围内添加数字会返回不正确的值
- c# - 如何在 C# 中将流代码转换为 observable(reactive)?
- twitter - 在 Vaadin 14.2 应用程序中使用 pac4j 通过 Twitter 进行身份验证:“code”:32,“message”:“无法对您进行身份验证。”
- c# - Windows 10 上的 winforms 应用程序的触摸屏键盘问题
- python - 我正在尝试学习 python,但我的代码不起作用,我不知道为什么
- ngxs - 使用动作处理程序时,Ngxs 未完全等待动作成功解析
- android - 为什么有些项目会导入 androidx.activity-ktx?
- html - 如果通过脚本设置值,则 datetime-local 上的输入不起作用
- java - 在 Ant 构建中将 zip64Mode 设置为“始终”后,它显示错误:运行 java 程序时无法找到或加载主类