主要内容

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

此示例显示了如何使用具有已知激光到相机校准参数的共同定位摄像机的标签数据来检测LIDAR中的车辆。在MATLAB®中使用此工作流程以基于相应图像的2-D边界框估算LIDAR中的3-D定向边界框。您还将在使用LIDAR数据中看到如何在相机图像中自动生成地面真理作为2-D边界框的距离。该图提供了该过程的概述。

加载数据

该示例使用从欧姆斯特OS1激光雷达传感器和安装在自我车辆上的正面相机的高速公路上收集的LIDAR数据。LIDAR和相机数据大致同步和校准以估计其内在和外在参数。有关LIDAR相机校准的更多信息,请参阅激光器和相机校准

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

Lidartarfileurl =“//www.tatmou.com/金宝appsupportfiles/lidar/data/WPI_LidarData.tar.gz”;imageTarFileUrl ='https://www.mathwands.com/金宝appsupportfiles/lidar/data/wpi_imagedata.tar.gz';outputFolder = fullfile (tempdir,批发价格指数的);lidardatatarfile = fullfile(outputfolder,“WPI_LidarData.tar.gz”);imageageatatarfile = fullfile(outputfolder,'wpi_imagedata.tar.gz');如果~存在(outputFolder'dir')MKDIR(输出文件)结尾如果〜存在(LidardataTarfile,“文件”)disp('下载WPI LIDAR驾驶数据(760 MB)......') websave (lidarDataTarFile lidarTarFileUrl)解压(lidarDataTarFile outputFolder)结尾%检查lidar tar.gz文件是否已下载,但不是未压缩。如果〜存在(FullFile(OutputFolder,“WPI_LidarData.mat”),“文件”)解压(lidarDataTarFile outputFolder)结尾如果〜存在(imageageatatarfile,“文件”)disp('下载WPI图像驱动数据(225 MB)...')Websave(ImageageataTarfile,ImagetarfileURL)Untar(ImageageTatarfile,OutputFolder)结尾%检查图像tar.gz文件是否已下载,但不会被解压缩。如果〜存在(FullFile(OutputFolder,'imagedata'),'dir')Untar(ImageageAtatarFile,OutputFolder)结尾imageDataLocation = fullfile (outputFolder,'imagedata');图像= Imageet(ImageageTalocation);imagefilenames = images.imageLocation;%加载将LIDAR数据下载到工作区中lidardata = fullfile(outputfolder,“WPI_LidarData.mat”);加载(Lidardata);%负载校准数据如果~ ('Calib''var') 加载('calib.mat'结尾定义相机到激光雷达的变换矩阵Camtolidar = Calib.extrinsics;内在= Calib.intrinsics;

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

此示例使用预订数据作为从相机图像中的2-D检测的地面真相。可以使用基于深度学习的对象探测器来生成这些2-D检测vevicledetoryolov2.vevicledetectorfasterrcnn., 和车辆.对于此示例,已经使用了2-D检测图片标志应用程序。这些2-D边界框是表格的载体: x y w h , 在哪里 x y 代表这一点XY.- 左上角的 - w h 分别表示包围框的宽度和高度。

将一个图像帧读入工作区,并使用覆盖的边框显示它。

加载imagegtruth.mat.im = imread(imagefilenames {50});imbbox = imagegtruth {50};图imshow(im)showshape('长方形'imBbox)

3-D区域提案

为了从图像数据中的二维矩形包围盒生成激光雷达中的长方体包围盒,提出了一个三维区域来减少包围盒估计的搜索空间。利用相机的固有参数和相机与激光雷达的外部参数,将图像中每个二维矩形边界框的角转换为三维线。这些3-D线形成截锥,从相关的2-D包围盒中向自我飞行器的相反方向展开。该区域内的激光雷达点根据欧氏距离被分割成不同的簇。用三维方向的包围盒对聚类进行拟合,并根据这些聚类的大小估计最佳聚类。基于相机图像中的二维包围盒,利用Bboxcameratolidar.功能。该图显示了2-D和3-D边界盒如何彼此相关。

3-D长立方体表示为表格的载体: xcen. ycen. ZCEN. 暗情 迪瓦 迪兹 rotx. 旋转 罗兹 , 在哪里 xcen. ycen. ZCEN. 代表长方体的质心坐标。 暗情 迪瓦 迪兹 表示长方体的长度沿着X-y-, 和z-轴,和 rotx. 旋转 罗兹 代表沿着长方体的旋转,以沿着长方体的旋转X-y-, 和z-轴。

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

PC = LIDARDATA {50};%裁剪点云加工前区域ROI = [0 70 -15 15 -3 8];Ind = findpointsinroi(PC,ROI);PC = SELECT(PC,IND);Lidarbbox = BboxCameratolidar(IMBBox,PC,内在机构,...Camtolidar,'ClusterThreshold'2,“MaxDetectionRange”,[1,70]);图pcshow(pc.location,pc.location(:,3))showshape('长方体',lidarbbox)视图([ -  2.90 71.59])

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

设置显示

使用HelperlidarfamaObjectsDisplay.类以可视化LIDAR和图像数据。此可视化提供了在图像上同时查看点云上的点云,图像,3-D边界框和2-D边界框。可视化布局由这些窗口组成:

  • 图像 - 可视化图像和关联的2-D边界框

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

  • 顶视图 - 从顶视图可视化点云和关联的3-D边界框

%初始化显示显示= helperLidarCameraObjectsDisplay;initializeDisplay(显示)%更新显示点云和图像UpdateDisplay(显示,IM,PC)

循环通过数据

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

为了我= 1:200%加载点云和图像im = imread(imagefilenames {i});我电脑= lidarData {};%加载图像地面真相imBbox = imageGTruth {};%拆除接地面地面index = segmentgroundfromlidardata(PC,'expationangledelta'15,...“InitialElevationAngle”,10);nongroundpts = Select(PC,〜GroundPtsIndex);如果imbbox [lidarbbox,〜,boxused] = bboxcameratolidar(imbbox,nongroundpts,内部,...Camtolidar,'ClusterThreshold'2,“MaxDetectionRange”[70]);显示带有边框的图像IM = UpdateImage(显示,IM,IMBbox);结尾用边界框%显示点云UpdateDisplay(显示,IM,PC);Updatelidarbbox(显示,lidarbbox,boxused)绘制结尾

通过使用边界框跟踪来检测边界框,例如联合概率数据关联(JPDA)。有关更多信息,请参阅使用LIDAR跟踪车辆:从点云到跟踪列表

估计车辆与Ego车辆的距离

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

%初始化显示显示= helperLidarCameraObjectsDisplay;initializeDisplay(显示)%让LIDAR到相机矩阵Lidartocam =反转(Camtolidar);%循环前200帧。要循环所有帧,用NUMEL(ImageGtruth)替换200为了i = 1:200 im = imread(imageFileNames{i}); / /我的名字我电脑= lidarData {};imBbox = imageGTruth {};%拆除接地面地面index = segmentgroundfromlidardata(PC,'expationangledelta'15,...“InitialElevationAngle”,10);nongroundpts = Select(PC,〜GroundPtsIndex);如果imbbox [lidarbbox,〜,boxused] = bboxcameratolidar(imbbox,nongroundpts,内部,...Camtolidar,'ClusterThreshold'2,“MaxDetectionRange”[70]);(距离、nearestRect idx) = helperComputeDistance (imBbox、nonGroundPts lidarBbox,...内在函数,李迪特罗姆);用边界框更新映像我= updateImage(显示、im、nearestRect、距离);lidarBbox updateLidarBbox(显示)结尾%更新显示UpdateDisplay(显示,IM,PC)绘制结尾

金宝app支持文件

helperComputeDistance

功能[distance, nearestRect, index] = helperComputeDistance(imBbox, pc, lidarBbox, intrinsic, lidarToCam)% helperComputeDistance估计给定二维边界框的距离使用LIDAR的3-D边界盒的%图像。它也计算2-D和3-D边界框之间的%关联MathWorks, Inc.版权所有numlidardetections = size(lidarbbox,1);etectentrect = zeros(0,4);距离=零(1,numlidardetections);索引=零(0,1);为了i = 1:numlidardetections bboxcuboid = lidarbbox(i,:);%创建cuboidModel型号= Cuboidmodel(Bboxcuboid);%查找长方体内部IND = findPointsinsidecuboid(型号,PC);PTS = SELECT(PC,IND);%投影长方体指向图像Impts = projectlidarpointsonimage(pts,内在,lidartocam);%找到对应于3-D边界框的2-D矩形[etectrect(i,:),idx] = findnearestrentangle(Impts,imbbox);索引(结束+ 1)= IDX;%找到了2-D矩形的距离距离(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)= sum(idx);结尾%获得最近的矩形[〜,idx] = max(比率);最近的= imbbox(idx,:);结尾功能Cornerscamera = GetCornersfrombox(Bbox)Cornerscamera = Zeros(4,2);Cornerscamera(1,1:2)= Bbox(1:2);Cornerscamera(2,1:2)= BBOX(1:2)+ [BBOX(3),0];角米拉米(3,1:2)= BBOX(1:2)+ BBOX(3:4);Cornerscamera(4,1:2)= Bbox(1:2)+ [0,Bbox(4)];结尾