此示例演示如何使用来自同一位置的摄像头的标签数据以及已知的激光雷达到摄像头校准参数来检测激光雷达中的车辆。在MATLAB®中使用此工作流,根据相应图像中的二维边界框估计激光雷达中的三维定向边界框。您还将看到如何使用激光雷达数据自动生成相机图像中二维边界框的地面真实值作为距离。此图提供了该过程的概述。
此示例使用从驱逐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(输出文件夹)结束如果~exist(lidardatarfile,“文件”)disp('下载WPI激光雷达驾驶数据(760MB)…') websave (lidarDataTarFile lidarTarFileUrl)解压(lidarDataTarFile outputFolder)结束%检查激光雷达tar.gz文件是否已下载,但未解压缩。如果~exist(完整文件(输出文件夹、,“WPI_LidarData.mat”),“文件”)解压(lidarDataTarFile outputFolder)结束如果~exist(imageDataTarFile,“文件”)disp('正在下载WPI图像驱动数据(225 MB)…')websave(imageDataTarFile,imageTarFileUrl)卸载(imageDataTarFile,outputFolder)结束%检查image tar.gz文件是否已下载,但未解压缩。如果~exist(完整文件(输出文件夹、,“图像数据”),“dir”)untar(imageDataTarFile,outputFolder)结束imageDataLocation = fullfile (outputFolder,“图像数据”); 图像=图像集(imageDataLocation);imagefilename=images.ImageLocation;%将下载的激光雷达数据加载到工作区lidarData=fullfile(输出文件夹,“WPI_LidarData.mat”);荷载(lidarData);%负载校准数据如果~ (“卡利布”,“var”)装载(“calib.mat”)结束定义相机到激光雷达的变换矩阵camToLidar=calib.extrinsics;intrinsics=calib.intrinsics;
或者,您可以使用web浏览器首先将数据集下载到本地磁盘,然后解压缩文件。
本例使用预先标记的数据作为从相机图像进行二维检测的基本事实。这些二维检测可以使用基于深度学习的对象检测器生成,如车辆检测器2
,车辆检测器
,及车辆检测器
.对于本例,已使用图片标志应用程序。这些二维边界框是以下形式的向量:
,在哪里
代表xy-左上角的坐标,以及
分别表示包围框的宽度和高度。
将一个图像帧读入工作区,并使用覆盖的边框显示它。
负载imageGTruth.matim=imread(imageFileNames{50});imBbox=imageGTruth{50};图imshow(im)showShape(“矩形”imBbox)
为了从图像数据中的二维矩形包围盒生成激光雷达中的长方体包围盒,提出了一个三维区域来减少包围盒估计的搜索空间。利用相机的固有参数和相机与激光雷达的外部参数,将图像中每个二维矩形边界框的角转换为三维线。这些3-D线形成截锥,从相关的2-D包围盒中向自我飞行器的相反方向展开。该区域内的激光雷达点根据欧氏距离被分割成不同的簇。用三维方向的包围盒对聚类进行拟合,并根据这些聚类的大小估计最佳聚类。基于相机图像中的二维包围盒,利用bboxCameraToLidar
此图显示了二维和三维边界框如何相互关联。
三维长方体表示为以下形式的向量: ,在哪里 表示长方体的质心坐标。 表示长方体沿直线的长度x-,y-,及z-轴线,以及 表示长方体沿轴的旋转(以度为单位)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,...卡姆托利达,“群集阈值”,2,“MaxDetectionRange”,[1,70]);图pcshow(pc.Location,pc.Location(:,3))showShape(“长方体”,lidarBbox)视图([-2.90 71.59])
为了改进检测到的包围盒,可以通过去除地平面对点云进行预处理。
使用HelperLidarCamerao对象显示
类以可视化激光雷达和图像数据。此可视化提供了同时查看点云、图像、点云上的三维边界框和图像上的二维边界框的功能。可视化布局由以下窗口组成:
图像-可视化图像和关联的二维边界框
透视视图-在透视视图中可视化点云和相关的三维包围框
俯视图-从俯视图可视化点云和关联的三维边界框
%初始化显示显示= helperLidarCameraObjectsDisplay;initializeDisplay(显示)%使用点云和图像更新显示更新显示(显示器、im、pc)
运行bboxCameraToLidar在前200帧的2d标签上生成3-D长方体
对于i=1:200%加载点云和图像im=imread(imageFileNames{i});pc=lidarData{i};%装载图像地面真相imBbox = imageGTruth {};%拆除接地面groundPtsIndex=分段groundfromLidardata(pc,“升降角度增量”,15,...“InitialElevationAngle”,10);nonGroundPts=select(pc,~groundPtsIndex);如果imBbox[LIDARBOX,~,boxUsed]=bboxCameraToLidar(imBbox,非圆形,内部,...卡姆托利达,“群集阈值”,2,“MaxDetectionRange”[70]);显示带有边框的图像im=更新图像(显示、im、imBbox);结束%显示带边界框的点云更新显示(显示、即时消息、pc);更新DARBBOX(显示、lidarBbox、boxUsed)drawnow结束
通过边界盒跟踪检测边界盒,如联合概率数据关联(JPDA)。有关详细信息,请参阅使用激光雷达跟踪车辆:从点云到跟踪列表.
对于前向碰撞预警等车辆安全特性,准确测量自我车辆与其他物体之间的距离是至关重要的。激光雷达传感器提供了物体与ego车辆的三维精确距离,它也可以用来从二维图像边界框自动创建地面真相。为二维边界框生成地面真实值,使用projectLidarPointsOnImage
函数将三维边界框内的点投影到图像上。通过求出与投影点的三维距离最小的包围盒,将投影点与二维包围盒关联起来。由于投影点是从激光雷达到相机的,所以采用相机到激光雷达的外部参数的逆。这张图说明了从激光雷达到相机的转换过程。
%初始化显示显示= helperLidarCameraObjectsDisplay;initializeDisplay(显示)%将激光雷达连接到摄像机矩阵利多卡因=倒置(camToLidar);%循环前200帧。要循环所有帧,请将200替换为numel(imageGTruth)对于i = 1:200 im = imread(imageFileNames{i}); / /我的名字我电脑= lidarData {};imBbox = imageGTruth {};%拆除接地面groundPtsIndex=分段groundfromLidardata(pc,“升降角度增量”,15,...“InitialElevationAngle”,10);nonGroundPts=select(pc,~groundPtsIndex);如果imBbox[LIDARBOX,~,boxUsed]=bboxCameraToLidar(imBbox,非圆形,内部,...卡姆托利达,“群集阈值”,2,“MaxDetectionRange”[70]);(距离、nearestRect idx) = helperComputeDistance (imBbox、nonGroundPts lidarBbox,...内源性药物(利多卡因);%使用边界框更新图像我= updateImage(显示、im、nearestRect、距离);lidarBbox updateLidarBbox(显示)结束%更新显示立即更新显示(显示、im、pc)绘图结束
功能[distance, nearestRect, index] = helperComputeDistance(imBbox, pc, lidarBbox, intrinsic, lidarToCam)% helperComputeDistance估计给定二维边界框的距离%使用激光雷达的三维边界框成像。它还计算%二维和三维边界框之间的关联MathWorks, Inc.版权所有numLidarDetections=大小(LIDARBOX,1);nearestRect=零(0,4);距离=零(1,numLidarDetections);指数=零(0,1);对于i=1:numLidarDetections bboxCuboid=lidarBbox(i,:);%创建cuboidModel模型=长方体模型(B长方体);%在长方体内找点ind=FindPointsInSide长方体(型号,pc);pts=选择(型号,ind);%投影长方体指向图像imPts=投影利多卡因点阵图像(pts、内在、利多卡因);%查找与三维边界框对应的二维矩形[nearestRect(i,:),idx]=findNearestRectangle(imPts,imBbox);索引(end+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)cornersCamera=0(4,2);cornersCamera(1,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;结束