KITTI数据集下相机2像素坐标到相机3的坐标转换问题求助
KITTI 相机2到相机3像素坐标转换问题解决方案
核心错误点
- 直接对3×4的
P_rect_02求逆完全错误:投影矩阵不是方阵,不存在严格的逆矩阵;且2D像素点没有深度信息时,逆投影只能得到一条射线,无法得到唯一3D空间点,必须先给定对应像素点的深度值才能完成转换。 - KITTI官方提供的
P_rect_0X矩阵的作用是将校正后相机0坐标系下的3D齐次点(X,Y,Z,1) 投影到对应X号相机的像素平面,不支持直接逆运算得到相机0的3D点。
正确转换步骤
前提:已获取相机2上待转换像素点(x_pixel_c2, y_pixel_c2)对应的深度值d(即该点在相机2坐标系下的Z轴坐标,单位为米,可通过雷达点云匹配、双目深度估计等方式获取);使用的是KITTI官方发布的已校正图像,无需额外处理畸变。
方法1:利用校正后相机特性直接计算(效率更高)
KITTI完成极线校正后,相机2和相机3的光轴平行、成像平面共面,仅在X轴方向存在约0.54m的基线偏移,且两个相机的校正内参的fx、fy、cy完全一致,仅cx有差异,可直接通过以下步骤计算:
- 从KITTI标定文件中获取相机2的校正内参:
fx2(X方向焦距)、cx2(X方向主点坐标)、cy2(Y方向主点坐标),相机3的cx3(X方向主点坐标),以及双目标定的基线长度b(约0.54m) - 计算该点在相机2坐标系下的3D坐标:
z_c2 = d x_c2 = (x_pixel_c2 - cx2) * z_c2 / fx2 y_c2 = (y_pixel_c2 - cy2) * z_c2 / fx2
- 转换到相机3坐标系下的3D坐标(仅X轴有偏移):
x_c3 = x_c2 - b y_c3 = y_c2 z_c3 = z_c2
- 投影到相机3的像素平面:
x_pixel_c3 = fx2 * x_c3 / z_c3 + cx3 y_pixel_c3 = fx2 * y_c3 / z_c3 + cy2
极线校正后转换得到的
y_pixel_c3应该和原始的y_pixel_c2差异极小,一般误差不超过1个像素,可以用这个特性验证转换是否正确。
方法2:使用官方P_rect矩阵计算
如果需要严格对齐官方标定逻辑,可以按以下步骤操作:
- 从标定文件中读取
P_rect_02和P_rect_03两个3×4的投影矩阵,以及待转换点的深度值d - 解析
P_rect_02的参数:
fx2 = P_rect_02[0, 0] cx2 = P_rect_02[0, 2] fy2 = P_rect_02[1, 1] cy2 = P_rect_02[1, 2] b02 = -P_rect_02[0, 3] / fx2 # 相机2相对校正后相机0的X轴基线
- 计算校正后相机0坐标系下的3D齐次点:
z0 = d y0 = (y_pixel_c2 - cy2) * z0 / fy2 x0 = (x_pixel_c2 - cx2) * z0 / fx2 + b02 pt_3d_cam0 = np.array([x0, y0, z0, 1])
- 投影到相机3像素平面:
pt_c3_hom = P_rect_03 @ pt_3d_cam0 x_pixel_c3 = pt_c3_hom[0] / pt_c3_hom[2] y_pixel_c3 = pt_c3_hom[1] / pt_c3_hom[2]
内容的提问来源于stack exchange,提问作者johndoe87
相关产品推荐
相关产品推荐

