我正在尝试使用 opencv 中的基本矩阵方法来获得一个相机姿势相对于另一个相机姿势的 R 和 t。我遵循的程序是:
- 使用 SIFT 标记特征
- 使用 FLANN 匹配来匹配特征
- 计算基本矩阵。
- 计算基本矩阵
- 执行 SVD 以获得 U、W、Vt
- 根据归一化/均质化点是否在相机前面,检查 R 和 t 的哪个组合是正确的。
为了进行简单的检查,我用一个图像对测试了这个,但相同的图像两次(这样相机和图像点都没有移动),因此平移向量应该是空的,旋转应该是恒等的。但是程序的输出最终是错误的。
The fundamental matrix is
[[ 3.59955121e-17 -5.77350269e-01 2.88675135e-01]
[ 5.77350269e-01 5.55111512e-17 2.88675135e-01]
[ -2.88675135e-01 -2.88675135e-01 0.00000000e+00]]
Fundamental matrix error check: 0.000000
The essential matrix is
[[ 4.51463713e-10 -7.25229650e+06 -2.37367600e+06]
[ 7.25229650e+06 6.98357978e-10 4.27847619e+06]
[ 2.37367600e+06 -4.27847619e+06 -1.33013600e-10]]
Translation matrix is
[-0.48905495 -0.2713251 0.82898007]
Rotation matrix is
[[ 0.52165052 -0.26538577 0.8108336 ]
[-0.26538577 0.85276538 0.4498462 ]
[ 0.8108336 0.4498462 -0.3744159 ]]
Roll: -26.965168, Pitch: 129.775110, Yaw: -54.179055
我还将此代码与一对相机一起使用,在 X 中位移了一定距离:但是我使用这种技术获得的欧拉角和平移(在那里,我认为是两个相机矩阵而不是一个)仍然是错误的。平移向量告诉我,我在 X 和 Z 中都移动了,并且旋转矩阵不准确。我对这里可能出了什么问题感到困惑。任何建议都会非常有帮助。谢谢!
编辑:我的代码可以在这里查看