为基于对极的姿势恢复估计相机焦距

Estimating Camera Focal Length for Epipolar based Pose Recovery

标题有点啰嗦,但基本上我有两张照片(我正在初始化场景图),我想恢复第二张照片的相对姿势。我知道如何从 Essential Matrix 恢复姿势,但这需要了解焦距(以像素为单位)和原点。起源很简单,但我该如何处理焦距。 我估计它并把它留在那里吗?我可以只使用 Fundamental Matrix 而不是 Essential 吗?或者我从估计 f 开始并执行循环,直到来自两个相机的光线通过关键点会聚或它们的距离最小化?

TLDR;不确定如何从对极几何中找到 F 以进行姿态恢复,感谢您的帮助

下面是部分代码:

pts_l_norm = cv2.undistortPoints(np.expand_dims(pts_l, axis=1), cameraMatrix=K_l, distCoeffs=None)
pts_r_norm = cv2.undistortPoints(np.expand_dims(pts_r, axis=1), cameraMatrix=K_r, distCoeffs=None)

E, mask = cv2.findEssentialMat(pts_l, pts_r, focal=1.0, pp=(0., 0.), method=cv2.RANSAC, prob=0.999, threshold=3.0)
points, R, t, mask = cv2.recoverPose(E, pts_l, pts_r)
print(R,t)

其中 K_l 是内在矩阵,pts_l 和 r 是用 SIFT

找到的关键点

所以我估计内在矩阵的方法是使用相机 EXIF 数据。 该数据将包括焦距及其 35mm 等效值(以毫米为单位)。并且会包括照片的尺寸,对估计原产地很有用。

然后您将不得不使用相机型号查找传感器尺寸并使用等式 f_X = F_X * width_in_pixels/width_in_mm 进行转换,其中 F_X 以毫米为单位。

这是我能找到的最好的方法,不幸的是,EXIF 数据并不总是包括 CCD 宽度,如果有,您可以使用它。