我一直在使用solvepnp()
来计算旋转和平移矩阵。但是从获得的旋转矩阵计算的欧拉角给出了非常不稳定的值。为了找到问题,我为我的标记设置了一组2D投影点,并保持solvepnp()
的其他参数不变。
例如:
2D积分
[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)。
我根本无法理解这种行为。有人可以解释一下吗? 我从旋转矩阵计算的euler角度使用this procedure。
答案 0 :(得分:0)
尝试Rodrigues()在旋转矩阵和旋转矢量之间进行转换,以确保一切都干净正确。非RANSAC版本对异常值非常敏感,这些异常值会在参数中产生巨大误差,从而使解决方案产生偏差。使用RANSAC version solvePnP可以使异常值更稳定。例如,向其中一个点坐标添加太多将最终使其成为异常值,并且在此之后它不会影响解决方案。
如果一切都失败了,写一系列单元测试:在3D中创建一组人工点(可能是非平面的),首先应用简单的翻译,在第二个变体中仅应用旋转,在第三个测试中应用两者。使用相机矩阵投影,然后将2D,3D点和投影矩阵插入代码中以查找姿势。如果结果偏离平移和旋转的反转,则应用于点将查找将参数输入到PnP中的错误。
答案 1 :(得分:0)
坐标系似乎不同.OpenCV使用right-hand coordinate-system Y-pointing downwards。在nghiaho.com,它说计算基于this,如果你看轴,它们似乎不匹配。我猜你使用Rodrigues进行矩阵计算?尝试比较旋转向量。