主要内容

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

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

s2.PNG

加载数据

本例使用了从Ouster OS1激光雷达传感器收集到的高速公路上的激光雷达数据和从安装在ego车辆上的前置摄像头收集到的图像数据。激光雷达和相机的数据是近似时间同步和校准,以估计其内在和外部参数。有关激光雷达相机校准的更多信息,请参见激光雷达和摄像机校准

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

lidarTarFileUrl =“//www.ru-cchi.com/supportfiles/lidar/data/WPI_LidarData.tar.gz”;imageTarFileUrl =“//www.ru-cchi.com/supportfiles/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激光雷达驾驶数据(760 MB)…) websave (lidarDataTarFile lidarTarFileUrl)解压(lidarDataTarFile outputFolder)结束检查是否下载了激光雷达tar.gz文件,但未解压。如果~ (fullfile (outputFolder,存在“WPI_LidarData.mat”),“文件”)解压(lidarDataTarFile outputFolder)结束如果~存在(imageDataTarFile“文件”) disp (正在下载WPI图像驱动数据(225 MB)…) websave (imageDataTarFile imageTarFileUrl)解压(imageDataTarFile outputFolder)结束检查映像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浏览器先将数据集下载到本地磁盘,然后解压文件。

本例使用预标记的数据作为摄像机图像的二维检测的地面真相。这些二维检测可以使用基于深度学习的对象检测器来生成,比如vehicleDetectorYOLOv2(自动驾驶工具箱)vehicleDetectorFasterRCNN(自动驾驶工具箱),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函数。该图显示了二维和三维边界框之间的相互关系。

boundingBoxWorkflow.gif

三维长方体表示为如下形式的向量: 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边界框的功能。可视化布局由以下窗口组成:

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

  • 透视视图——在透视视图中可视化点云和相关的3-D边界框

  • 俯视图——从俯视图可视化点云和相关的3-D边界框

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

遍历数据

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

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

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

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

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

lcc.png

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

支持文件

helperComputeDistance

函数[distance, nearestRect, index] = helperComputeDistance(imBbox, pc, lidarBbox, intrinsic, lidarToCam)% helperComputeDistance估计给定的二维边界框的距离%的图像使用三维边界框从激光雷达。它还计算二维和三维边界框之间的关联。版权所有: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) numberbox = 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:);结束函数拐角摄像机= get拐角sfrombbox (bbox)拐角摄像机= 0 (4,2);cornersCamera (1:2) = bbox (1:2);corncamera (2,1:2) = bbox(1:2) + [bbox(3),0];corncamera (3,1:2) = bbox(1:2) + bbox(3:4);corncamera (4,1:2) = bbox(1:2) + [0,bbox(4)];结束
Baidu
map