我一直在使用solvepnp()
来计算旋转和平移矩阵。但是由得到的旋转矩阵计算出的欧拉角值非常不稳定。为了找到问题,我为我的标记设置了一组2D投影点,并保持solvepnp()
的其他参数不变。
如价值观:
2 d分
[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()的输出旋转矩阵计算得到欧拉角 θ (x)为-26.4877
接下来,我只增加第一个点(I)的x值。e 219.67473)通过0.1来检查θ (x)欧拉角的变化(保持剩余点和其他参数不变)并再次运行solvepnp()。对于这个非常小的变化,我的值从-19度,-18度(对于x coord = 223.074)然后突然跳到27度一会儿(对于x coord = 223.174到226.974)然后下降到1.3度(对于x coord = 227.074)。
我完全不能理解这种行为。有人能解释一下吗?我的欧拉角计算从旋转矩阵使用这个程序。
尝试Rodrigues()在旋转矩阵和旋转向量之间进行转换,以确保一切都是干净正确的。非RANSAC版本可能对异常值非常敏感,这些异常值会在参数中产生巨大误差,从而使解决方案产生偏差。使用RANSAC版本的solvePnP可以使其对离群值更稳定。例如,在其中一个点的坐标上添加太多将最终使其成为一个异常值,并且它不会影响之后的解决方案。
如果一切都失败了,编写一系列单元测试:在3D(可能是非平面)中创建一组人工点,首先应用简单的平移,在第二种变体中只应用旋转,在第三种测试中同时应用。项目使用您的相机矩阵,然后插入您的2D, 3D点和投影矩阵到您的代码中,以找到姿势。如果结果偏离了应用于点的平移和旋转的逆,则查找向PnP提供参数的错误。
看起来坐标系统不一样。OpenCV使用向下的右手坐标系y。在nghiaho.com上,它说计算是基于此的,如果你看一下坐标轴,它们似乎不匹配。我猜你在用Rodrigues计算矩阵?试着比较旋转矢量