KITTI数据集应用指南1:坐标转换

2020-05-18 15:38:46 浏览数 (1)

大家好。

KITTI数据集是自动驾驶领域最知名的数据集之一。可以用来从事立体图像、光流估计、三维检测、三维跟踪等方面的研究。

今天我们对KITTI数据集进行介绍,主要侧重目标检测部分,讲讲数据使用过程中非常重要的一个环节——坐标转换。

坐标转换的原因是多传感器的存在,KITTI数据采集汽车装载了4部摄像机和1部激光雷达,获得的图像和点云分别处于不同的坐标系,因此当我们需要同时利用图像和点云时,就涉及到了坐标转换。

1

首先我们看一下车辆各个传感器的坐标系是如何约定的:

如表所示:

摄像机的坐标系

x——向右;y——向下;z——向前

激光雷达坐标系(笛卡尔坐标系)

X——向前;y——向左;z——向上

摄像机参考坐标系(下文简称参考坐标系)

0号摄像机的坐标系

矫正摄像机坐标系(下文简称矫正坐标系)

参考坐标系经过旋转得到

2

我们想要知道如何把点云投影到图像上进行显示,做出下面这种效果:

已知,KITTI提供的原始点云数据的坐标在笛卡尔坐标系中。

首先将点云由笛卡尔坐标系转换到参考坐标系中,需要乘变换矩阵V2C。

python def project_velo_to_ref(self, pts_3d_velo): pts_3d_velo = self.cart2hom(pts_3d_velo) # nx4 return np.dot(pts_3d_velo, np.transpose(self.V2C))

接着,再从参考坐标系变换到矫正坐标系,需要乘矫正矩阵R0。

代码语言:javascript复制

   def project_ref_to_rect(self, pts_3d_ref):
       ''' Input and Output are nx3 points '''
       return np.transpose(np.dot(self.R0, np.transpose(pts_3d_ref)))

最后,把位于矫正坐标系中的点云投影到图像中,这一过程需要乘投影矩阵P。

代码语言:javascript复制

   def project_rect_to_image(self, pts_3d_rect):
       ''' Input: nx3 points in rect camera coord.
           Output: nx2 points in image2 coord.
       '''
       pts_3d_rect = self.cart2hom(pts_3d_rect)
       pts_2d = np.dot(pts_3d_rect, np.transpose(self.P)) # nx3
       pts_2d[:,0] /= pts_2d[:,2]
       pts_2d[:,1] /= pts_2d[:,2]        return pts_2d[:,0:2]

上述用到的变换矩阵在数据集中的calib文件中都提供了,而且四个投影矩阵,分别可以将矫正坐标系中的点投影到4个摄像机对应的图像中。

小结

搞清楚数据集的用法对于我们理解代码有很大帮助,更重要的是,如果要用自己开发的数据集进行实验,不可避免地要进行数据集的处理。KITTI坐标转换的方法在很多自动驾驶目标检测的论文和算法里都有涉及,我们在后续文章还会继续与大家分享。

参考文献:Geiger2013IJRR, Vision meets Robotics: The KITTI Dataset.

论文链接:

http://www.cvlibs.net/publications/Geiger2013IJRR.pdf

数据集链接:

http://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=3d

0 人点赞