cv2.stereoRectify 仅当旋转和平移从相机 2 到相机 1 时才起作用

问题描述 投票:0回答:1

我正在使用 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)
python opencv ros robotics
1个回答
0
投票

计算从 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
© www.soinside.com 2019 - 2024. All rights reserved.