kitti数据集相机投影矩阵

时间:2018-11-09 01:52:54

标签: computer-vision projection camera-calibration

我正在查看kitti数据集,尤其是如何将世界点转换为图像坐标。我看了一下README,它在下面说,我需要先转换为相机坐标,然后再乘以投影矩阵。我有2个问题,来自非计算机视觉背景

  1. 我查看了calib.txt中的数字,尤其是矩阵为3x4,在最后一列中具有非零值。我一直认为这个矩阵= K[I|0],其中K是相机的固有矩阵。那么,为什么最后一列非零,这意味着什么呢?例如P2是
array([[7.070912e+02, 0.000000e+00, 6.018873e+02, 4.688783e+01],
       [0.000000e+00, 7.070912e+02, 1.831104e+02, 1.178601e-01],
       [0.000000e+00, 0.000000e+00, 1.000000e+00, 6.203223e-03]])
  1. 将投影应用于[u,v,w]并将u,v除以w之后,这些值是相对于图像中心的原点还是相对于图像左上方的原点?

自述文件:

  

calib.txt:摄像机的校准数据:P0 / P1是3x4   投影       校正后的矩阵。这里P0代表左边,P1代表       正确的相机。 Tr将点从Velodyne坐标转换为       左校正的摄像机坐标系。为了从       velodyne扫描仪到第i个图像平面上的点x,因此您必须       将其转换为:

  x = Pi * Tr * X

1 个答案:

答案 0 :(得分:1)

参考:

  1. How to understand the KITTI camera calibration files?
  2. Format of parameters in KITTI's calibration file
  3. http://www.cvlibs.net/publications/Geiger2013IJRR.pdf

答案:

我强烈建议您阅读上述参考资料。他们可能会解决您的大部分(即使不是全部)问题。

对于问题2:图像上的投影点相对于左上方的原点。参见参考文献2和3,图像中远3d点的坐标为(center_xcenter_y),其值在P_rect矩阵中提供。或者,您可以使用一些简单的代码验证这一点:

import numpy as np
p = np.array([[7.070912e+02, 0.000000e+00, 6.018873e+02, 4.688783e+01],
              [0.000000e+00, 7.070912e+02, 1.831104e+02, 1.178601e-01],
              [0.000000e+00, 0.000000e+00, 1.000000e+00, 6.203223e-03]])
x = [0, 0, 1E8, 1]  # A far 3D point
y = np.dot(p, x)
y[0] /= y[2]
y[1] /= y[2]
y = y[:2]
print(y)

您将看到一些输出,例如:

array([6.018873e+02, 1.831104e+02 ])

非常接近(p[0, 2], p[1, 2]),又名(center_xcenter_y)。