ios - 了解solvepnp的输出?

标签 ios opencv rotational-matrices euler-angles

我一直在使用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)。

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

最佳答案

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

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

关于ios - 了解solvepnp的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22343578/

相关文章:

ios - UIAlertView 没有在正确的时间显示

java - 如何将 3D 矩阵逆时针旋转 90 度?

android - 从旋转矩阵中提取偏航、俯仰和滚动

c++ - GLM 从 vec3 生成旋转矩阵

ios - 在 iOS 中将条码扫描器作为键盘的方法?

objective-c - 结构体中的结构体数组 [Objective-c]

ios - Firebase Storage iOS 放置在上传完成之前调用的文件完成处理程序

c++ - OpenCV 透视校正和裁剪

c++ - Opencv C++ 调整大小函数 : new Width should be multiplied by 3

c# - Visual C++ 输出窗口中出现额外的单词