我试图估计两个图像之间相机姿势的差异。特别是我用同一个相机(已知的内在参数矩阵K)拍了两张照片。第二个是在绕 y 轴旋转 24 度、垂直于地板并沿 x 和 z 轴平移约 5 厘米后拍摄的。
在 python 中,我使用 SIFT 提取特征,然后应用 RANSAC 过滤内点。从内点开始,我使用 cv2.findEssentialMatrix 计算了基本矩阵,然后使用 cv2.decomposeEssentialMat 对其进行分解。它返回 2 个矩阵,但选择一个矩阵对我来说不是问题,因为我知道我正在寻找的那个是代表围绕 y 轴的主要旋转并且理论上不围绕其他两个轴旋转的那个。我遇到的第一个问题是,平均而言,算法相当不错,估计旋转 23-26 度,但有时结果差异太大,比如 30 或 10 度。这是由于选择了内点而发生的,但我尝试调整特征匹配器中的 Lowe 比率和 ransac 中的阈值,但没有任何改进。有没有办法改善这一点?
我遇到的另一个问题是翻译向量。从一方面来看,它没有假设预期值,我认为这与上面的部分有关。此外,相机兼作深度相机,因此我可以访问每个特征与相机平面的距离,我希望这可以用来从基本矩阵分解产生的单位向量传递到 3D 向量(例如以米为单位)。
我留下一些代码来帮助阅读。
model, inliers = ransac(
(src_pts, dst_pts),
EssentialMatrixTransform, min_samples=8,
residual_threshold=.05, max_trials=10000
)
E = cv2.findEssentialMat(src, dst, K)
[R1,R2,t_dec]=cv2.decomposeEssentialMat(E[0])
我也搜索了这些函数的源代码,但没有找到。我希望有人能在这些问题上启发我,真的很感激。