Kitti Velodyne 点到像素坐标
Kitti Velodyne point to pixel coordinate
从Velodyne点,如何获取每个相机的像素坐标?
使用pykitti
point_cam0 = data.calib.T_cam0_velo.dot(point_velo)
我们可以得到图像上的投影,即 Kitti Dataset paper:
的等式 7
y = Prect(i) Rrect( 0) Tvelocam x
但是从那里,如何获得每个图像上的实际像素坐标?
更新: PyKitti 版本 0.2.1 公开了所有相机的投影矩阵。
我最近遇到了同样的问题。对我来说,问题在于 pykitty 没有为所有相机公开 Prect 和 Rrect 矩阵。
对于 Pykitti > 0.2.1,使用来自校准数据的 Prect 和 Rrect。
对于以前的版本,您有两个选择:
- 手动输入矩阵(数据在每个序列的 .xml 校准文件中)。
- 使用 pykitti 的这个分支:https://github.com/Mi-lo/pykitti/
然后,您可以使用等式 7 将 velodyne 点投影到图像中。注意:
您将需要 3D 点作为齐次坐标中的 4xN 数组。 pykitti 返回的点是一个 Nx4 numpy 数组,反射率在第 4 列。您可以使用下面的 prepare_velo_points 函数准备点,该函数仅保留反射率 > 0 的点,然后将反射率值替换为 1 以获得齐次坐标。
velodyne 是 360°。即使对于 在相机后面 的点,公式 7 也会给你一个结果(它们会像在前面一样被投影,但垂直镜像)。为避免这种情况,您应该只投影相机前面的点。为此,您可以使用下面的函数 project_velo_points_in_img。它 returns 2d 指向齐次坐标,因此您应该丢弃第 3 行。
以下是我使用的函数:
def prepare_velo_points(pts3d_raw):
'''Replaces the reflectance value by 1, and tranposes the array, so
points can be directly multiplied by the camera projection matrix'''
pts3d = pts3d_raw
# Reflectance > 0
pts3d = pts3d[pts3d[:, 3] > 0 ,:]
pts3d[:,3] = 1
return pts3d.transpose()
def project_velo_points_in_img(pts3d, T_cam_velo, Rrect, Prect):
'''Project 3D points into 2D image. Expects pts3d as a 4xN
numpy array. Returns the 2D projection of the points that
are in front of the camera only an the corresponding 3D points.'''
# 3D points in camera reference frame.
pts3d_cam = Rrect.dot(T_cam_velo.dot(pts3d))
# Before projecting, keep only points with z>0
# (points that are in fronto of the camera).
idx = (pts3d_cam[2,:]>=0)
pts2d_cam = Prect.dot(pts3d_cam[:,idx])
return pts3d[:, idx], pts2d_cam/pts2d_cam[2,:]
希望对您有所帮助!
从Velodyne点,如何获取每个相机的像素坐标?
使用pykitti
point_cam0 = data.calib.T_cam0_velo.dot(point_velo)
我们可以得到图像上的投影,即 Kitti Dataset paper:
y = Prect(i) Rrect( 0) Tvelocam x
但是从那里,如何获得每个图像上的实际像素坐标?
更新: PyKitti 版本 0.2.1 公开了所有相机的投影矩阵。
我最近遇到了同样的问题。对我来说,问题在于 pykitty 没有为所有相机公开 Prect 和 Rrect 矩阵。
对于 Pykitti > 0.2.1,使用来自校准数据的 Prect 和 Rrect。
对于以前的版本,您有两个选择:
- 手动输入矩阵(数据在每个序列的 .xml 校准文件中)。
- 使用 pykitti 的这个分支:https://github.com/Mi-lo/pykitti/
然后,您可以使用等式 7 将 velodyne 点投影到图像中。注意:
您将需要 3D 点作为齐次坐标中的 4xN 数组。 pykitti 返回的点是一个 Nx4 numpy 数组,反射率在第 4 列。您可以使用下面的 prepare_velo_points 函数准备点,该函数仅保留反射率 > 0 的点,然后将反射率值替换为 1 以获得齐次坐标。
velodyne 是 360°。即使对于 在相机后面 的点,公式 7 也会给你一个结果(它们会像在前面一样被投影,但垂直镜像)。为避免这种情况,您应该只投影相机前面的点。为此,您可以使用下面的函数 project_velo_points_in_img。它 returns 2d 指向齐次坐标,因此您应该丢弃第 3 行。
以下是我使用的函数:
def prepare_velo_points(pts3d_raw):
'''Replaces the reflectance value by 1, and tranposes the array, so
points can be directly multiplied by the camera projection matrix'''
pts3d = pts3d_raw
# Reflectance > 0
pts3d = pts3d[pts3d[:, 3] > 0 ,:]
pts3d[:,3] = 1
return pts3d.transpose()
def project_velo_points_in_img(pts3d, T_cam_velo, Rrect, Prect):
'''Project 3D points into 2D image. Expects pts3d as a 4xN
numpy array. Returns the 2D projection of the points that
are in front of the camera only an the corresponding 3D points.'''
# 3D points in camera reference frame.
pts3d_cam = Rrect.dot(T_cam_velo.dot(pts3d))
# Before projecting, keep only points with z>0
# (points that are in fronto of the camera).
idx = (pts3d_cam[2,:]>=0)
pts2d_cam = Prect.dot(pts3d_cam[:,idx])
return pts3d[:, idx], pts2d_cam/pts2d_cam[2,:]
希望对您有所帮助!