大家好。
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。
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。
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