我正在使用 euroc-mav 数据集从立体图像创建视差图:https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets。
在此数据集中,相机已经相对于通用坐标系(imu 坐标系)进行了校准(内在和外在)。
我的目标是校正两个图像以创建视差图。我正在使用 opencv cv2.stereoRectify()。
在opencv文档上,stereoRectify函数接收两个相机之间的旋转和平移(从相机1的坐标系到相机2的坐标系)。
我首先计算了如下之间的旋转:
relative_R_cam0_cam1 = np.linalg.inv(R_cam0) @ R_cam1
relative_T_cam0_cam1 = np.linalg.inv(R_cam0) @ (T_cam1 - T_cam0)
然后,我检查当我计算从相机 2 帧到相机 1 帧的旋转和平移时发生的情况,并进行以下更改:
relative_R_cam0_cam1 = np.linalg.inv(R_cam1) @ R_cam0
relative_T_cam0_cam1 = np.linalg.inv(R_cam1) @ (T_cam0 - T_cam1)
我收到了很好的视差图:
opencv StereoRectify 是否有错误?或者我错过了什么?
这是我的完整代码:
cam0_intrinsics = np.array([
[458.654, 0.0, 367.215],
[0.0, 457.296 , 248.3759],
[0.0, 0.0, 1.0]])
cam0_distortion = np.array([[-0.28340811, 0.07395907, 0.00019359, 1.76187114e-05]])
cam1_intrinsics = np.array([
[457.587, 0.0, 379.999],
[0.0, 456.134 , 255.238],
[0.0, 0.0, 1.0]])
cam1_distortion = np.array([[-0.28368365, 0.07451284, -0.00010473, -3.55590700e-05]])
R_cam0 = np.array([
[0.0148655429818, -0.999880929698, 0.00414029679422],
[0.999557249008, 0.0149672133247, 0.025715529948],
[-0.0257744366974, 0.00375618835797, 0.999660727178]
])
T_cam0 = np.array([-0.0216401454975, -0.064676986768, 0.00981073058949])
R_cam1 = np.array([
[0.0125552670891, -0.999755099723, 0.0182237714554],
[0.999598781151, 0.0130119051815, 0.0251588363115],
[-0.0253898008918, 0.0179005838253, 0.999517347078]
])
T_cam1 = np.array([-0.0198435579556, 0.0453689425024, 0.00786212447038])
relative_R_cam0_cam1 = np.linalg.inv(R_cam1) @ R_cam0
relative_T_cam0_cam1 = np.linalg.inv(R_cam1) @ (T_cam0 - T_cam1)
# relative_R_cam0_cam1 = np.linalg.inv(R_cam0) @ R_cam1
# relative_T_cam0_cam1 = np.linalg.inv(R_cam0) @ (T_cam1 - T_cam0)
R1, R2, P1, P2, Q, roi1, roi2 = cv2.stereoRectify( \
cam0_intrinsics, cam0_distortion, cam1_intrinsics, cam1_distortion, (752, 480), relative_R_cam0_cam1, relative_T_cam0_cam1)
计算从 cam0 到 cam1 的变换的正确方法是这样的:
relative_R_cam0_cam1 = R_cam1 @ R_cam0
relative_T_cam0_cam1 = -R_cam1 @ np.linalg.inv(R_cam0) @ T_cam0 + T_cam1