我正在查看kitti数据集,尤其是如何将世界点转换为图像坐标。我看了一下README,它在下面说,我需要先转换为相机坐标,然后再乘以投影矩阵。我有2个问题,来自非计算机视觉背景
= 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]])
自述文件:
calib.txt:摄像机的校准数据:P0 / P1是3x4 投影 校正后的矩阵。这里P0代表左边,P1代表 正确的相机。 Tr将点从Velodyne坐标转换为 左校正的摄像机坐标系。为了从 velodyne扫描仪到第i个图像平面上的点x,因此您必须 将其转换为:
x = Pi * Tr * X
答案 0 :(得分:1)
参考:
答案:
我强烈建议您阅读上述参考资料。他们可能会解决您的大部分(即使不是全部)问题。
对于问题2:图像上的投影点相对于左上方的原点。参见参考文献2和3,图像中远3d点的坐标为(center_x
,center_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_x
,center_y
)。