【问题标题】:Understanding the output of solvepnp?了解solvepnp的输出?
【发布时间】:2014-03-12 06:25:06
【问题描述】:

我一直在使用solvepnp() 来计算旋转和平移矩阵。但是从获得的旋转矩阵计算出的欧拉角给出了非常不稳定的值。为了找出问题所在,我为我的标记设置了一组 2D 投影点,并将 solvepnp() 的其他参数保持不变。
例如值:

二维点
[219.67473, 242.78395;
363.4151, 238.61298;
503.04855, 234.56117;
501.70917, 628.16742;
500.58069, 959.78564;
383.1756, 972.02679;
262.8746, 984.56982;
243.17044, 646.22925]
solvepnp()的输出旋转矩阵计算得到的欧拉角theta(x)-26.4877

接下来,我只将第一个点的 x 值(即 219.67473)增加了 0.1,以检查 theta(x) 欧拉角的变化(保持其余点和其他参数不变)并运行 solvepnp()再次。对于那个非常小的变化,我的值从-19度,-18度(x坐标= 223.074)然后突然跳到27度一段时间(x坐标= 223.174到226.974)然后下降到 1.3 度(对于 x 坐标 = 227.074)。

我根本无法理解这种行为。有人可以解释一下吗? 我从旋转矩阵计算欧拉角使用this procedure

【问题讨论】:

    标签: ios opencv rotational-matrices euler-angles


    【解决方案1】:

    尝试Rodrigues() 进行旋转矩阵和旋转向量之间的转换,以确保一切都正确无误。非 RANSAC 版本可能对异常值非常敏感,这些异常值会在参数中产生巨大误差,从而使解决方案产生偏差。使用solvePnP 的RANSAC version 可以使其对异常值更稳定。例如,向其中一个点坐标添加太多最终会使其成为异常值,并且不会影响之后的解决方案。

    如果一切都失败了,编写一系列单元测试:在 3D 中创建一组人工点(可能是非平面的),首先应用简单的平移,在第二个变体中仅应用旋转,在第三个测试中应用两者。使用您的相机矩阵进行投影,然后将您的 2D、3D 点和投影矩阵插入您的代码以查找姿势。如果结果偏离了您应用于点的平移和旋转的倒数,请查找向 PnP 提供参数的错误。

    【讨论】:

      【解决方案2】:

      似乎坐标系不同。OpenCV 使用right-hand coordinate-system Y-pointing downwards。在 nghiaho.com 上,它说计算基于this,如果您查看轴,它们似乎不匹配。我猜你正在使用Rodrigues 进行矩阵计算?尝试比较旋转向量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-13
        • 2012-10-21
        • 2018-09-22
        • 2019-02-18
        • 2012-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多