我正在观察kitti数据集,特别是如何将一个世界点转换为图像坐标。我看了自述,它说,我需要转换为相机坐标,然后乘以投影矩阵。我有两个问题,来自非计算机视觉背景。
= K[I|0]
,其中K是相机的内在矩阵。那么,为什么最后一列是非零,这意味着什么呢?例如,P2是数组([ 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])
README:
calib.txt:摄像机的标定数据: P0/P1是校正后的3x4投影矩阵。在这里,P0表示左边,P1表示右边的摄像机。Tr将一个点从velodyne坐标转换为左校正摄像机坐标系。为了将velodyne扫描仪中的X点映射到I‘’th图像平面中的点x,您必须将其转换为: X= Pi * Tr *X
发布于 2019-10-13 04:01:16
参考文献:
答案:
我强烈建议你阅读上面的参考资料。他们可以解决你的大部分问题,如果不是全部的话。
对于问题2:图像上的投影点相对于左上角的原点。参见ref 2& 3,图像中远三维点的坐标是(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
)。
发布于 2020-05-08 17:02:37
对于所有P矩阵(3x4),它们代表:
P(i)rect = [[fu 0 cx -fu*bx],
[0 fv cy -fv*by],
[0 0 1 0]]
最后一列是基线,以米为单位。参考摄像机0。您可以看到P0在最后一列中有所有的零,因为它是参考摄像机。
这篇文章有更多的细节:How Kitti calibration matrix was calculated?
https://stackoverflow.com/questions/53218743
复制相似问题