赞
踩
KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办,是目前国际上自动驾驶场景下常用的数据集之一。KITTI数据集的数据采集平台装配有2个灰度摄像机,2个彩色摄像机,一个Velodyne 64线3D激光雷达,4个光学镜头,以及1个GPS导航系统。
官网 国内下载地址1 国内下载地址2
为了生成双目立体图像,相同类型的摄像头相距54cm安装。由于彩色摄像机的分辨率和对比度不够好,所以还使用了两个立体灰度摄像机,它和彩色摄像机相距6cm安装。为了方便传感器数据标定,规定坐标系方向如下[2] :
• Camera: x = right, y = down, z = forward
• Velodyne: x = forward, y = left, z = up
• GPS/IMU: x = forward, y = left, z = up
def velodyne2img(calib_dir, img_id, velo_box): """ :param calib_dir: calib文件的地址 :param img_id: 要转化的图像id :param velo_box: (n,8,4),要转化的velodyne frame下的坐标,n个3D框,每个框的8个顶点,每个点的坐标(x,y,z,1) :return: (n,4),转化到 image frame 后的 2D框 的 x1y1x2y2 """ # 读取转换矩阵 calib_txt=os.path.join(calib_dir, img_id) + '.txt' calib_lines = [line.rstrip('\n') for line in open(calib_txt, 'r')] for calib_line in calib_lines: if 'P2' in calib_line: P2=calib_line.split(' ')[1:] P2=np.array(P2, dtype='float').reshape(3,4) elif 'R0_rect' in calib_line: R0_rect=np.zeros((4,4)) R0=calib_line.split(' ')[1:] R0 = np.array(R0, dtype='float').reshape(3, 3) R0_rect[:3,:3]=R0 R0_rect[-1,-1]=1 elif 'velo_to_cam' in calib_line: velo_to_cam = np.zeros((4, 4)) velo2cam=calib_line.split(' ')[1:] velo2cam = np.array(velo2cam, dtype='float').reshape(3, 4) velo_to_cam[:3,:]=velo2cam velo_to_cam[-1,-1]=1 tran_mat=P2.dot(R0_rect).dot(velo_to_cam) # 3x4 velo_box=velo_box.reshape(-1,4).T img_box = np.dot(tran_mat, velo_box).T img_box=img_box.reshape(-1,8,3) img_box[:,:,0]=img_box[:,:,0]/img_box[:,:,2] img_box[:, :, 1] = img_box[:, :, 1] / img_box[:, :, 2] img_box=img_box[:,:,:2] # (n,8,2) x1y1=np.min(img_box,axis=1) x2y2 = np.max(img_box, axis=1) result =np.hstack((x1y1,x2y2)) #(n,4) return result
Tr_velo_to_cam * y : 把激光雷达坐标系下的点y投影到相机坐标系
R0_rect * Tr_velo_to_cam * y: 将激光雷达坐标系下的点投影到编号为2的相机坐标系,结果为(x,y,z,1),直接取前三个为投影结果,当计算出z<0的时候表明该点在相机的后面 。标注文件中的中心坐标即是相机2下的坐标系。
P2 * R0_rect * Tr_velo_to_cam * y:将激光雷达坐标系下的点投影到编号为2的相机采集的图像中,结果形式为(u,v,w)。 Ps:u,w需要除以w后取整才是最终的像素。
标注文件中16个属性,即16列。但我们只能够看到前15列数据,因为第16列是针对测试场景下目标的置信度得分,也可以认为训练场景中得分全部为1但是没有专门标注出来。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。