主要内容

利用图像标签在激光雷达中检测车辆

本示例展示了如何使用已知激光雷达对相机校准参数的同位置摄像机的标签数据来检测激光雷达中的车辆。在MATLAB®中使用该工作流,基于相应图像中的二维边界盒估计激光雷达中的三维定向边界盒。您还将看到如何使用激光雷达数据在相机图像中自动生成作为2-D边界框的距离的地面真相。该图提供了流程的概述。

加载数据

这个例子使用了Ouster OS1激光雷达传感器在高速公路上收集的激光雷达数据和安装在ego车上的前置摄像头的图像数据。激光雷达和相机数据大致同步和校准,以估计其内在和外在参数。有关激光雷达相机校准的更多信息,请参阅激光雷达和相机校准

注意:数据的下载时间取决于你的网络连接速度。在执行此代码块期间,MATLAB暂时无响应。

lidarTarFileUrl =“//www.tatmou.com/金宝appsupportfiles/lidar/data/WPI_LidarData.tar.gz”;imageTarFileUrl =“//www.tatmou.com/金宝appsupportfiles/lidar/data/WPI_ImageData.tar.gz”;outputFolder = fullfile (tempdir,批发价格指数的);lidarDataTarFile = fullfile (outputFolder,“WPI_LidarData.tar.gz”);imageDataTarFile = fullfile (outputFolder,“WPI_ImageData.tar.gz”);如果~存在(outputFolder“dir”mkdir (outputFolder)结束如果~存在(lidarDataTarFile“文件”) disp (“下载WPI Lidar行车数据(760mb)…”) websave (lidarDataTarFile lidarTarFileUrl)解压(lidarDataTarFile outputFolder)结束%检查lidar tar.gz文件是否已下载,但未解压。如果~ (fullfile (outputFolder,存在“WPI_LidarData.mat”),“文件”)解压(lidarDataTarFile outputFolder)结束如果~存在(imageDataTarFile“文件”) disp (下载WPI图像驱动数据(225mb)…) websave (imageDataTarFile imageTarFileUrl)解压(imageDataTarFile outputFolder)结束%检查image tar.gz文件是否已下载,但未解压缩。如果~ (fullfile (outputFolder,存在“imageData”),“dir”)解压(imageDataTarFile outputFolder)结束imageDataLocation = fullfile (outputFolder,“imageData”);图像= imageSet (imageDataLocation);imageFileNames = images.ImageLocation;%加载下载的激光雷达数据到工作空间lidarData = fullfile (outputFolder,“WPI_LidarData.mat”);负载(lidarData);负载校准数据如果~ (“calib”“var”)负载(“calib.mat”结束%定义相机到激光雷达的变换矩阵camToLidar = calib.extrinsics;intrinsic = calib.intrinsics;

或者,您可以使用web浏览器先将数据集下载到本地磁盘,然后解压缩文件。

这个例子使用预先标记的数据作为从摄像机图像中进行二维检测的地面事实。这些二维检测可以使用基于深度学习的目标检测器生成,比如vehicleDetectorYOLOv2vehicleDetectorFasterRCNN,vehicleDetectorACF.对于这个示例,2-D检测已经使用图片标志这些二维边界框是如下形式的向量: x y w h ,在那里 x y 代表了xy-左上角坐标,和 w h 分别表示边框的宽度和高度。

将图像帧读取到工作区中,并将其显示为覆盖边框。

负载imageGTruth.mat我= imread (imageFileNames {50});imBbox = imageGTruth {50};图imshow (im) showShape (“矩形”imBbox)

三维区域的建议

为了在激光雷达中从图像数据中提取出二维矩形边界框,提出了一个三维区域来减少搜索空间。利用相机固有参数和相机对激光雷达的固有参数,将图像中每个二维矩形边界框的边角转换为三维线。这些3-D线从相关的2-D边界框中在自我车辆的相反方向形成截锥。该区域内的激光雷达点根据欧几里德距离被分割成不同的簇。用三维定向的包围盒对簇进行拟合,并根据簇的大小估计出最佳簇。基于摄像机图像中的二维边界框,利用激光雷达点云bboxCameraToLidar函数。此图显示了二维和三维边界框之间的关系。

3-D长方体可以用以下形式的向量表示: xcen ycen zcen dimx dimy dimz rotx roty rotz ,在那里 xcen ycen zcen 表示长方体的质心坐标。 dimx dimy dimz 表示长方体沿的长度x -y -,z -轴, rotx roty rotz 表示长方体沿x -y -,z -轴。

利用图像的地面真值估计激光雷达点云中的三维包围盒。

电脑= lidarData {50};%裁剪点云只处理前部区域ROI = [0 70 -15 15 -3 8];印第安纳州= findPointsInROI (pc, roi);电脑=选择(pc,印第安纳州);lidarBbox = bboxCameraToLidar (intrinsic imBbox, pc,...camToLidar,“ClusterThreshold”2,“MaxDetectionRange”[70]);图pcshow (pc.Location pc.Location (:, 3) showShape (“长方体”lidarBbox)视图([-2.90 - 71.59])

为了改进检测到的边界框,对点云进行预处理,去除地平面。

设置显示

使用helperLidarCameraObjectsDisplay类来可视化激光雷达和图像数据。这种可视化提供了同时查看点云、图像、点云上的3-D边界框和图像上的2-D边界框的能力。可视化布局由以下窗口组成:

  • 图像-可视化图像和相关的二维边界框

  • 透视视图-在透视视图中可视化点云和相关的三维边界框

  • 顶视图-从顶视图中可视化点云和相关的三维边界框

%初始化显示显示= helperLidarCameraObjectsDisplay;initializeDisplay(显示)%用点云和图像更新显示updateDisplay(显示、即时通讯、电脑)

遍历数据

在前200帧的2d标签上运行bboxCameraToLidar生成3-D长方体

i = 1:200%加载点云和图像我= imread (imageFileNames{我});我电脑= lidarData {};%加载图像地面真相imBbox = imageGTruth {};%移除接地面groundPtsIndex = segmentGroundFromLidarData(电脑,“ElevationAngleDelta”15岁的...“InitialElevationAngle”10);nonGroundPts =选择(pc, ~ groundPtsIndex);如果imBbox [lidarBbox,~,boxUsed] = bboxCameraToLidar(imBbox,nonGroundPts,intrinsics,...camToLidar,“ClusterThreshold”2,“MaxDetectionRange”[70]);%显示带有边框的图像我= updateImage(显示、im、imBbox);结束%显示带有边框的点云updateDisplay(显示、即时通讯、电脑);updateLidarBbox drawnow(显示、lidarBbox boxUsed)结束

通过边界盒跟踪检测边界盒,如联合概率数据关联(JPDA)。有关更多信息,请参见用激光雷达跟踪车辆:从点云到跟踪表

估计车辆与自我车辆的距离

对于汽车安全特性,如向前碰撞预警,准确测量自我车辆和其他物体之间的距离是至关重要的。激光雷达传感器提供了物体与自我车辆的三维精确距离,它也可以用来从二维图像边界框自动创建地面真相。为二维边界框生成地面真实值,使用projectLidarPointsOnImage函数将三维边界框内的点投影到图像上。通过寻找与投影点的欧氏距离最小的边界框,将投影点与二维边界框相关联。由于投影点是从激光雷达到相机,所以可以利用相机到激光雷达外部参数的逆。这幅图说明了从激光雷达到相机的转换。

%初始化显示显示= helperLidarCameraObjectsDisplay;initializeDisplay(显示)%将激光雷达对准摄像机矩阵lidarToCam =反转(camToLidar);%循环前200帧。要循环所有帧,将200替换为numel(imageGTruth)im = imread(imageFileNames{i});我电脑= lidarData {};imBbox = imageGTruth {};%移除接地面groundPtsIndex = segmentGroundFromLidarData(电脑,“ElevationAngleDelta”15岁的...“InitialElevationAngle”10);nonGroundPts =选择(pc, ~ groundPtsIndex);如果imBbox [lidarBbox,~,boxUsed] = bboxCameraToLidar(imBbox,nonGroundPts,intrinsics,...camToLidar,“ClusterThreshold”2,“MaxDetectionRange”[70]);(距离、nearestRect idx) = helperComputeDistance (imBbox、nonGroundPts lidarBbox,...intrinsic lidarToCam);%更新带有边框的图像我= updateImage(显示、im、nearestRect、距离);lidarBbox updateLidarBbox(显示)结束%更新显示updateDisplay drawnow(显示、即时通讯、电脑)结束

金宝app支持文件

helperComputeDistance

函数[distance, nearestRect, index] = helperComputeDistance(imBbox, pc, lidarBbox, intrinsic, lidarToCam)% helperComputeDistance估计给定二维边界框的距离%图像使用三维包围盒从激光雷达。它还计算2-D和3-D边界框之间的关联版权所有2020 MathWorks, Inc。numLidarDetections =大小(lidarBbox, 1);nearestRect = 0 (0, 4);距离= 0(1、numLidarDetections);指数= 0 (0,1);i = 1:numLidarDetections bboxCuboid = lidarBbox(i,:);%创建cuboidModel模型= cuboidModel (bboxCuboid);找出长方体内部的点印第安纳州= findPointsInsideCuboid(模型、pc);分=选择(pc,印第安纳州);%项目长方体指向图像imPts = projectLidarPointsOnImage (pts,内在,lidarToCam);%找到与三维边界框对应的二维矩形[nearestRect(我,:),idx] = findNearestRectangle (imPts imBbox);指数(结束+ 1)= idx;%求二维矩形的距离距离(i) = min (pts.Location (: 1));结束结束函数[nearestRect,idx] = findNearestRectangle(imPts,imBbox) numbox = size(imBbox,1);率= 0 (numBbox, 1);%遍历所有矩形i = 1: numbox bbox = imBbox(i,:);角落= getCornersFromBbox (bbox);%找出投影点与矩形的重叠比例idx = (imPts(: 1) >角落(1,1))& (imPts(: 1) <角落(2,1))&...(imPts(:, 2) >角落(1、2)& (imPts(:, 2) <角落(3,1));比(i) = (idx)之和;结束得到最接近的矩形[~, idx] = max(比例);nearestRect = imBbox (idx:);结束函数cornersCamera = getCornersFromBbox(bbox) cornersCamera = 0 (4,2);cornersCamera (1:2) = bbox (1:2);cornercamera (2,1:2) = bbox(1:2) + [bbox(3),0];cornercamera (3,1:2) = bbox(1:2) + bbox(3:4);cornercamera (4,1:2) = bbox(1:2) + [0,bbox(4)];结束