【问题标题】:Point Cloud from KITTI stereo images来自 KITTI 立体图像的点云
【发布时间】:2018-01-01 16:59:22
【问题描述】:

我尝试根据来自 KITTI 立体图像数据集的图像创建点云,以便稍后我可以估计一些对象的 3D 位置。

原始图像看起来像this

到目前为止我所拥有的:

  1. cv2.StereoSGBM_create 产生差异
window_size = 9
minDisparity = 1
stereo = cv2.StereoSGBM_create(
    blockSize=10,
    numDisparities=64,
    preFilterCap=10,
    minDisparity=minDisparity,
    P1=4 * 3 * window_size ** 2,
    P2=32 * 3 * window_size ** 2
)
  1. 使用来自 KITTI 校准文件的数据,使用 cv2.stereoRectify 计算出 Q 矩阵。
# K_xx: 3x3 calibration matrix of camera xx before rectification
K_L = np.matrix(
    [[9.597910e+02, 0.000000e+00, 6.960217e+02],
     [0.000000e+00, 9.569251e+02, 2.241806e+02],
     [0.000000e+00, 0.000000e+00, 1.000000e+00]])
K_R = np.matrix(
    [[9.037596e+02, 0.000000e+00, 6.957519e+02],
     [0.000000e+00, 9.019653e+02, 2.242509e+02],
     [0.000000e+00, 0.000000e+00, 1.000000e+00]])

# D_xx: 1x5 distortion vector of camera xx before rectification
D_L = np.matrix([-3.691481e-01, 1.968681e-01, 1.353473e-03, 5.677587e-04, -6.770705e-02])
D_R = np.matrix([-3.639558e-01, 1.788651e-01, 6.029694e-04, -3.922424e-04, -5.382460e-02])

# R_xx: 3x3 rotation matrix of camera xx (extrinsic)
R_L = np.transpose(np.matrix([[9.999758e-01, -5.267463e-03, -4.552439e-03],
                              [5.251945e-03, 9.999804e-01, -3.413835e-03],
                              [4.570332e-03, 3.389843e-03, 9.999838e-01]]))
R_R = np.matrix([[9.995599e-01, 1.699522e-02, -2.431313e-02],
                 [-1.704422e-02, 9.998531e-01, -1.809756e-03],
                 [2.427880e-02, 2.223358e-03, 9.997028e-01]])

# T_xx: 3x1 translation vector of camera xx (extrinsic)
T_L = np.transpose(np.matrix([5.956621e-02, 2.900141e-04, 2.577209e-03]))
T_R = np.transpose(np.matrix([-4.731050e-01, 5.551470e-03, -5.250882e-03]))

IMG_SIZE = (1392, 512)

rotation = R_L * R_R
translation = T_L - T_R

# output matrices from stereoRectify init
R1 = np.zeros(shape=(3, 3))
R2 = np.zeros(shape=(3, 3))
P1 = np.zeros(shape=(3, 4))
P2 = np.zeros(shape=(3, 4))
Q = np.zeros(shape=(4, 4))

R1, R2, P1, P2, Q, validPixROI1, validPixROI2 = cv2.stereoRectify(K_L, D_L, K_R, D_R, IMG_SIZE, rotation, translation,
                                                                  R1, R2, P1, P2, Q,
                                                                  newImageSize=(1242, 375))

生成的矩阵如下所示(此时我怀疑它是否正确):

[[   1.            0.            0.         -614.37893072]
 [   0.            1.            0.         -162.12583194]
 [   0.            0.            0.          680.05186262]
 [   0.            0.           -1.87703644    0.        ]]
  1. 使用 reprojectImageTo3D 生成的点云如下所示:point cloud

现在问题部分开始了:)

  1. reprojectImageTo3D返回的所有值都是负数可以吗?
  2. 考虑到它是 KITTI 数据集并且它们的相机校准数据可用,这些值的单位是什么?
  3. 最后,如果我有拍摄这些照片的相机的 GPS 坐标,是否可以将这些值转换为诸如经度/纬度之类的值?

如果有任何帮助,我们将不胜感激!

【问题讨论】:

  • 我正在尝试一些非常相似的东西。你解决了这个问题吗?

标签: opencv computer-vision stereo-3d disparity-mapping


【解决方案1】:
  1. reprojectImageTo3D 返回的所有值都可以为负吗?

一般来说,不,至少对于 Z 值。 reprojectImageTo3D 返回的值是相对于相机原点的真实坐标,因此 Z 值为负数意味着该点位于相机后面(这在几何上是不正确的)。 X 和 Y 值可以为负,因为相机原点在 FOV 的中心,所以负 X 值表示该点在“左侧”,负 Y 值表示该点在下面”。但是对于 Z 值,不,它们不应该是负数。

您的 Q 矩阵几乎变成了恒等式,因为我认为您在调用 stereoRectify 时错误地设置了旋转矩阵。当您传递rotationtranslation 时,这是从摄像机 1 到摄像机 2 的 单次 旋转,而不是从摄像机 1 到摄像机 2 的组合旋转。您正在做的是将两个旋转相乘将其中一个移调后放在一起;相反,您应该只传递R_L(因为根据您的描述,我认为这意味着它是从左到右相机的旋转)。

  1. 考虑到它是 KITTI 数据集并且它们的相机校准数据可用,这些值的单位是什么?

我不熟悉 KITTI 数据集,但调用 reprojectImageTo3D 后返回的值是真实世界的单位,通常是米。

  1. 最后,如果我有拍摄这些照片的相机的 GPS 坐标,是否可以将这些值转换为诸如经度\纬度之类的值?

reprojectImageTo3D 返回的坐标是相对于相机原点的真实坐标。如果您有拍摄照片的相机的 GPS 坐标,则可以使用重投影返回的 (X, Y, Z) 坐标来操作纬度/经度值。

【讨论】:

    猜你喜欢
    • 2012-11-09
    • 2020-05-19
    • 2016-12-30
    • 2020-07-14
    • 2014-04-04
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2018-01-01
    相关资源
    最近更新 更多