主要内容

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

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

加载数据

此示例使用从驱逐OS1激光雷达传感器在公路上收集的激光雷达数据和安装在ego车辆上的前向摄像头的图像数据。激光雷达和相机数据大致进行时间同步和校准,以估计其内在和外在参数。有关激光雷达相机校准的更多信息,请参见激光雷达和相机校准

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

LidarFileURL=“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/lidar/data/WPI_LidarData.tar.gz”;imageTarFileUrl ='//www.tianjin-qmedu.com/万博1manbetxsupportfiles/lidar/data/WPI_ImageData.tar.gz';outputFolder = fullfile (tempdir,批发价格指数的); LIDARDatarFile=fullfile(输出文件夹,“WPI_LidarData.tar.gz”); imageDataTarFile=fullfile(outputFolder,'WPI_ImageData.tar.gz');如果~存在(outputFolder“dir”)mkdir(输出文件夹)结束如果~存在(lidarDataTarFile“文件”)disp(“正在下载WPI激光雷达驱动数据(760 MB)……”) websave (lidarDataTarFile lidarTarFileUrl)解压(lidarDataTarFile outputFolder)结束%检查激光雷达tar.gz文件是否已下载,但未解压缩。如果~ (fullfile (outputFolder,存在“WPI_LidarData.mat”),“文件”)解压(lidarDataTarFile outputFolder)结束如果~exist(imageDataTarFile,“文件”)disp('正在下载WPI图像驱动数据(225 MB)…')websave(imageDataTarFile,imageTarFileUrl)卸载(imageDataTarFile,outputFolder)结束%检查image tar.gz文件是否已下载,但未解压缩。如果~ (fullfile (outputFolder,存在“imageData”),“dir”)untar(imageDataTarFile,outputFolder)结束imageDataLocation = fullfile (outputFolder,“imageData”); 图像=图像集(imageDataLocation);imagefilename=images.ImageLocation;%将下载的激光雷达数据加载到工作区lidarData=fullfile(输出文件夹,“WPI_LidarData.mat”);负载(lidarData);%负载校准数据如果~ (“卡利布”“var”)装载(“calib.mat”结束定义相机到激光雷达的变换矩阵camToLidar = calib.extrinsics;intrinsic = calib.intrinsics;

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

本例使用预先标记的数据作为来自相机图像的二维检测的地面真实值。这些二维检测可以使用基于深度学习的对象检测器生成,比如vehicleDetectorYOLOv2vehicleDetectorFasterRCNN,vehicleDetectorACF.对于本例,已使用图片标志应用程序。这些二维边界框是以下形式的向量: 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此图显示了二维和三维边界框如何相互关联。

三维长方体表示为如下形式的向量: xcen 艾辛 zcen dimx 朦胧的 迪姆兹 rotx roty rotz ,在哪里 xcen 艾辛 zcen 表示长方体的质心坐标。 dimx 朦胧的 迪姆兹 表示长方体沿直线的长度x-y-,z-轴线,以及 rotx roty rotz 表示长方体沿轴的旋转(以度为单位)x-y-,z-轴。

使用图像的地面真实值来估计激光雷达点云中的三维边界框。

pc=lidarData{50};%裁剪点云以仅处理前部区域roi=[0 70-15 15-3 8];ind=findPointsInROI(pc,roi);pc=select(pc,ind);LIDARBOX=bboxCameraToLidar(imBbox,pc,intrinsics,...camToLidar,“群集阈值”2,“MaxDetectionRange”[70]);图pcshow (pc.Location pc.Location (:, 3) showShape (“长方体”,lidarBbox)视图([-2.90 71.59])

为了改进检测到的包围盒,可以通过去除地平面对点云进行预处理。

设置显示

使用HelperLidarCamerao对象显示类以可视化激光雷达和图像数据。此可视化提供了同时查看点云、图像、点云上的三维边界框和图像上的二维边界框的功能。可视化布局由以下窗口组成:

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

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

  • 俯视图-从俯视图可视化点云和关联的三维边界框

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

遍历数据

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

对于i=1:200%加载点云和图像im=imread(imageFileNames{i});pc=lidarData{i};加载图像地面真实imBbox = imageGTruth {};%拆除接地面groundPtsIndex = segmentGroundFromLidarData(电脑,“ElevationAngleDelta”,15,...“InitialElevationAngle”,10);nonGroundPts=select(pc,~groundPtsIndex);如果imBbox[LIDARBOX,~,boxUsed]=bboxCameraToLidar(imBbox,非圆形,内部,...camToLidar,“群集阈值”2,“MaxDetectionRange”[70]);显示带有边框的图像im=更新图像(显示、im、imBbox);结束%显示带边界框的点云updateDisplay(显示、即时通讯、电脑);updateLidarBbox drawnow(显示、lidarBbox boxUsed)结束

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

估计车辆与Ego车辆的距离

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

%初始化显示显示= helperLidarCameraObjectsDisplay;initializeDisplay(显示)将激光雷达对准摄像机矩阵lidarToCam =反转(camToLidar);%循环前200帧。要循环所有帧,将200替换为numel(imageGTruth)对于i = 1:200 im = imread(imageFileNames{i}); / /我的名字我电脑= lidarData {};imBbox = imageGTruth {};%拆除接地面groundPtsIndex = segmentGroundFromLidarData(电脑,“ElevationAngleDelta”,15,...“InitialElevationAngle”,10);nonGroundPts=select(pc,~groundPtsIndex);如果imBbox[LIDARBOX,~,boxUsed]=bboxCameraToLidar(imBbox,非圆形,内部,...camToLidar,“群集阈值”2,“MaxDetectionRange”[70]);(距离、nearestRect idx) = helperComputeDistance (imBbox、nonGroundPts lidarBbox,...内源性药物(利多卡因);用边框更新图像我= updateImage(显示、im、nearestRect、距离);lidarBbox updateLidarBbox(显示)结束%更新显示updateDisplay drawnow(显示、即时通讯、电脑)结束

万博1manbetx支持文件

helperComputeDistance

函数[distance, nearestRect, index] = helperComputeDistance(imBbox, pc, lidarBbox, intrinsic, lidarToCam)% helperComputeDistance估计给定二维边界框的距离%使用激光雷达的三维边界框成像。它还计算% 2-D和3-D边界框之间的关联MathWorks, Inc.版权所有numLidarDetections=大小(LIDARBOX,1);nearestRect=零(0,4);距离=零(1,numLidarDetections);指数=零(0,1);对于i=1:numLidarDetections bboxCuboid=lidarBbox(i,:);%创建cuboidModel模型= cuboidModel (bboxCuboid);%在长方体内找点印第安纳州= findPointsInsideCuboid(模型、pc);分=选择(pc,印第安纳州);%投影长方体指向图像imPts=投影利多卡因点阵图像(pts、内在、利多卡因);%查找与三维边界框对应的二维矩形[nearestRect(我,:),idx] = findNearestRectangle (imPts imBbox);指数(结束+ 1)= idx;%求二维矩形的距离距离(i) = min (pts.Location (: 1));结束结束函数[nearestRect,idx] = findNearestRectangle(imPts,imBbox) numBbox = size(imBbox,1);率= 0 (numBbox, 1);%迭代所有矩形对于i = 1:numBbox 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); / /在bbox中设置拐角cornersCamera (1:2) = bbox (1:2);cornersCamera(2,1:2) = bbox(1:2) + [bbox(3),0];cornersCamera(3,1:2) = bbox(1:2) + bbox(3:4);cornersCamera(4,1:2) = bbox(1:2) + [0,bbox(4)];结束