1

我一直在使用solvepnp()计算旋转和平移矩阵。但是从获得的旋转矩阵计算出的欧拉角给出了非常不稳定的值。为了找到问题,我为我的标记设置了一组 2D 投影点,并保持其他参数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]
的欧拉角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)。

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

4

2 回答 2

0

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

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

于 2014-03-12T08:01:20.737 回答
0

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

于 2014-03-12T08:03:49.577 回答