主要内容

使用单眼相机的视觉感知

此示例显示了如何构建能够进行车道边界和车辆检测的单眼摄像机传感器仿真。传感器将在车辆坐标系中报告这些检测。在此示例中,您将了解自动化驾驶工具箱™使用的坐标系,以及涉及样品单眼摄像机传感器的设计的计算机视觉技术。

概述

包含ADAS功能或设计成完全自动驾驶的车辆依赖于多个传感器。这些传感器可以包括声纳、雷达、激光雷达和摄像机。这个例子说明了设计单目摄像机系统所涉及的一些概念。这种传感器可以完成许多任务,包括:

  • 车道边界检测

  • 检测车辆,人类和其他物体

  • 估计自我车辆到障碍物的距离

随后,单眼摄像机传感器返回的读数可用于发出车道偏离警告,碰撞警告或设计车道保持辅助控制系统。结合其他传感器,它也可用于实施紧急制动系统和其他安全关键特征。

该示例实现了在完全开发的单目相机系统上找到的功能的子集。它检测车道边界和背部车辆,并在车辆坐标系中报告它们的位置。

定义摄像机的配置

了解相机的内部和外部标定参数对像素和车辆坐标的精确转换至关重要。

首先定义相机的内在参数。下面的参数是早先使用使用棋盘式校准模式的摄像机校准程序确定的。你可以使用相机校准器应用程序为您的相机获取它们。

焦点= [309.4362,344.2161];像素单元中的%[FX,FY]林城= [318.9034,257.5352];以像素坐标中的%[CX,CY]光学中心图像= [480,640];% (nrows, mcols)

注意,忽略镜头失真系数,因为数据中的失真很小。参数存储在a中摄像头对象。

Camintrinsics =摄像石(FocalLength,Principalpoint,Imageize);

接下来,定义相对于车辆底盘的摄像机方向。您将使用这些信息来建立摄像机外部信息,定义3d摄像机坐标系相对于车辆坐标系的位置。

高度= 2.1798;距离地面米的百分比高度距= 14;以学位的相机的%音高

的返回的旋转和平移矩阵可以推导出上述量外在功能。俯仰指定从水平位置的相机的倾斜度。对于在该示例中使用的相机,传感器的卷和偏航均为零。定义内在内部和外部的整个配置存储在单纸巾对象。

传感器=单纸(Camintrinsics,高度,“音高”、沥青);

请注意单纸巾对象设置了一个非常特定的车辆坐标系,其中X.- 从车辆前进,y- 车辆左侧的轴向点,以及Z.- 从地面上指出。

缺省情况下,坐标系的原点在地面上,直接在相机的焦点定义的相机中心下方。可以通过使用来移动原点传感器位置财产的单纸巾对象。此外,单纸巾提供ImagetovehiclevehicleToImage在图像和车辆坐标系统之间转换的方法。

注意:坐标系之间的转换假设扁平道路。它基于建立一个定址矩阵,该矩阵将成像平面上的位置映射到路面上的位置。非污水道路引入距离计算中的错误,尤其是远离车辆的位置。

加载一帧视频

在处理整个视频之前,处理单个视频帧以说明单目相机传感器设计中涉及的概念。

首先创建一个VideoReader打开视频文件的对象。要成为记忆力,VideoReader一次加载一个视频帧。

VideoName =.“caltech_cordova1.avi”;Videoreader = Videoreader(VideoName);

读取包含车道标记和车辆的有趣框架。

时间戳= 0.06667;从视频开始时%的时间videoReader。CurrentTime =时间戳;指向选定的帧框架= ReadFrame(Videoreader);%在时间戳秒读取帧imshow(框架)%显示框架

注意:此示例忽略镜头失真。如果您担心镜头失真引入的距离测量中的错误,此时您将使用undostortimage.功能,以消除镜头失真。

创建鸟瞰图图像

有很多方法可以段和检测车道标记。一种方法涉及使用鸟瞰图图像变换。虽然它引起了计算成本,但这种转变提供了一个主要优势。鸟瞰图中的车道标记具有均匀的厚度,从而简化分割过程。属于同一通道的车道标记也变得平行,从而更容易进一步分析。

鉴于相机设置,birdsEyeView对象将原始图像转换为鸟瞰图。此对象允许您使用车辆坐标指定要转换的区域。请注意,车辆坐标单元由该坐标单元建立单纸巾对象时,相机安装高度指定为米。例如,如果高度以毫米为单位指定,则模拟的其余部分将使用毫米。

使用车辆坐标,定义要变换的区域distAheadOfSensor = 30;%以米为单位,如前所述在相机高度输入中指定的spacetooneside = 6;所有其他距离的单位也是米bottomofoffset = 3;Outview = [底部OFFSET,DistaheadofSensor,--spacetoonide,Spacetoonide];%[xmin,xmax,ymin,ymax]图像= [NaN,250];%输出图像宽度为像素;自动选择高度以保护每个像素比为单位birdseeconfig = birdsEyeView(sensor, outView, imageSize);

生成鸟瞰图象。

birdseyeimage = Transportimage(Birdseyeconfig,框架);图imshow(birdseyeimage)

由于具有较少的像素并且因此需要更大的内插,因此远离传感器的区域更模糊。

注意,您可以在不使用鸟瞰视图的情况下完成后面的处理步骤,只要您能够在车辆坐标中定位车道边界候选像素即可。

在车辆坐标中找到车道标记

拥有鸟瞰图象,您现在可以使用segmentLaneMarkerRidge功能从路面分隔车道标记候选像素。选择这种技术的简单性和相对有效性。存在包括语义分割(深学习)和可转向过滤器的替代分割技术。您可以替换下面的这些技术以获得下一个阶段所需的二进制掩码。

下面函数的大多数输入参数都是用世界单位指定的,例如,输入的车道标记的宽度segmentLaneMarkerRidge。世界单位的使用允许您轻松尝试新的传感器,即使输入图像尺寸发生变化。这对于使设计更加强大和灵活,对于更换相机硬件和处理许多国家的不同标准来说,这非常重要。

%转换为灰度Birdseyeimage = IM2Gray(BirdseyeImage);世界单位的%车道标记分割ROIvevicleroi = outview  -  [-1,2,-3,3];向左和向右看3米,在传感器前面4米大约allanemarkerwidthvehicle = 0.25;% 25厘米%检测车道特征laneSensitivity = 0.25;birdsEyeViewBW = segmentLaneMarkerRidge(birdsEyeImage, birdseeconfig, approxLaneMarkerWidthVehicle,......'roi',vevicleroi,'敏感度',lanesensity);数字imshow(birdseyeviewbw)

定位单个车道标记发生在锚定到相机传感器的车辆坐标中。该示例使用抛物线车道边界模型,AX ^ 2 + Bx + C,以表示车道标记。其他表示,例如三程度多项式或花键。对于车辆坐标进行转换是必要的,否则,帕拉克拉不能正确地表示车道标记曲率,而抛物线被透视变形的影响。

车道模型适用于沿着车辆路径的车道标记。横穿道路的车道标志或涂在柏油路上的路标都被拒绝。

在车辆坐标中获得车道候选点[imagex,imagey] =查找(birdseyeviewbw);xyboundarypoints = ImageTovehicle(Birdseyeconfig,[Imagey,Imagex]);

由于分段点包含许多不属于实际车道标记的异常值,因此使用基于随机样本共识(Ransac)的鲁棒曲线拟合算法。

以数组的形式返回边界及其抛物线参数(a, b, c)抛物面普遍对象,界限

Maxlanes = 2;%寻找两个车道标记boundaryWidth = 3 * approxLaneMarkerWidthVehicle;%展开边界宽度[边界,边界点] = FindParaboliclaneBoundaries(XYBoundaryPoints,边界WIDTH,......'maxnumboundaries',maxlanes,“validateBoundaryFcn”,@validateboutbaryfcn);

请注意FindParaboliclaneBoundaries.取函数句柄,vignateboutalaryfcn.。此示例函数在此示例的末尾列出。使用此附加输入,允许您根据A,B,C参数的值拒绝某些曲线。它还可以通过基于先前的视频帧来限制未来A,B,C值来利用一系列帧的时间信息。

确定自我通道的边界

上一步中发现的一些曲线可能仍然无效。例如,当曲线适合于人行横道标记时。使用额外的启发式措施拒绝许多这样的曲线。

%建立基于其长度拒绝界限的标准maxPossibleXLength = diff (vehicleROI (1:2));minXLength = maxPossibleXLength * 0.60;%建立一个门槛拒绝短边界Isofminlength = Arrayfun(@(b)diff(b.xextent)> minxlength,边界);边界=边界(Isofminlength);

根据所计算的强度度量删除其他边界FindParaboliclaneBoundaries.功能。根据ROI和图像尺寸设置车道强度阈值。

%为了计算最大强度,假设ROI内的所有图像像素%是车道候选点birdimageroi = vehicletoimageroi(birdseyeconfig,vevicleroi);[LaneImagex,LaneImagey] = Meshgrid(BirdaImageroi(1):Birdimageroi(2),BirdaImageroi(3):BirdimAgeroi(4));%将图像点转换为车辆点车辆点= ImageTovehicle(Birdseyeconfig,[LaneImagex(:),LaneImagey(:)]);找到任意车道唯一x轴位置的最大数目%边界maxpointsinonelane = numel(唯一(车辆点(:,1)));%设置车道边界的最大长度为ROI的长度maxlaneLength = diff(车辆车辆(1:2));%计算此图像大小/ROI大小的最大可能车道强度%规格maxStrength = maxPointsInOneLane / maxLaneLength;%拒绝弱边界Isstrong = [边界.strength]> 0.4 * maxstrength;界限=边界(ISStrong);

将车道标记类型作为实心/虚线分类的启发式包括在该示例底部列出的帮助函数中。了解车道标记类型对于自动转向车辆至关重要。例如,禁止穿过固体标记。

边界= classifyLaneTypes(边界,边界点);如果存在,%会找到两个自我车道xOffset = 0;距离传感器0米distancetoboundaries =界限..puteboutbarymodel(xoffset);找出应聘者的自我界限LeftegogoboundaryIndex = [];RightegoboundaryIndex = [];mindlistance = min(distancetoboundaries(distancetoboundaries> 0));minrdistance = max(distancetoboundaries(distancetoboundaries <= 0));如果〜isempty(mindlistance)leftegogogoboundaryindex = distancetoboundaries == mindlistance;结尾如果〜isempty(minrdistance)lightegoboundaryindex = distancetoboundaries == minrdistance;结尾Leftegogoboundary =边界(LetfegogogOwnaryIndex);Rightegoboundary =界限(RightegoboundaryIndex);

在鸟瞰图图像和常规视图中显示检测到的车道标记。

xVehiclePoints = bottomOffset: distAheadOfSensor;birdsEyeWithEgoLane = insertLaneBoundary(birdsEyeImage, leftEgoBoundary, birdseeconfig, xVehiclePoints,“颜色”'红色');birdsEyeWithEgoLane = insertLaneBoundary(birdsEyeWithEgoLane, rightgoboundary, birdseeconfig, xVehiclePoints,“颜色”'绿色');frameWithEgoLane = insertLaneBoundary(frame, leftEgoBoundary, sensor, xVehiclePoints,“颜色”'红色');frameWithEgoLane = insertLaneBoundary(frameWithEgoLane, rightgoboundary, sensor, xVehiclePoints,“颜色”'绿色');图形子图(“位置”, [0, 0, 0.5, 1.0])%[左,下,宽,高]为标准化单位imshow(birdseyewithegolane)子图(“位置”, [0.5, 0, 0.5, 1.0]) imshow(framewiththegolane)

找到车辆坐标的车辆

车辆的检测和跟踪是车辆前方碰撞预警(FCW)和自动紧急制动(AEB)系统的关键。

加载普里克预训练的聚合通道特征(ACF)检测器以检测车辆的正面和后部。这样的检测器可以处理发出碰撞警告的场景很重要。例如,对于检测自由车辆前面的道路的车辆检测行驶是不够的。

探测器=车辆levedetectoracf();%普通车辆的宽度在1.5 - 2.5米之间车辆Width = [1.5,2.5];

使用configureDetectorMonoCamera专门化通用ACF检测器的功能考虑典型汽车应用的几何体。通过通过这种相机配置,这款新探测器仅搜索沿路表面的车辆,因为没有点寻找高于消失点的车辆。这节省了计算时间并减少了误报的数量。

monoDetector = configuredetectormoncamera(检测器,传感器,车辆宽度);[Bboxes,Scores] =检测(MonoDetector,Frame);

由于本示例仅演示如何处理单个帧,因此不能在原始检测之上应用跟踪。跟踪的添加使得返回车辆位置的结果更加稳健,因为即使车辆被部分遮挡,跟踪器仍会继续返回车辆的位置。有关更多信息,请参见使用相机跟踪多辆车辆的例子。

接下来,将车辆检测转换为车辆坐标。当computevehiclecations包括在该示例末尾的功能,根据图像坐标中的检测算法返回的限定框来计算车辆坐标中的车辆的位置。它返回车辆坐标中边界框底部的中心位置。因为我们正在使用单眼摄像机传感器和简单的配合,因此只能准确地计算沿着道路表面的距离。在3-D空间中计算任意位置需要使用立体声相机或另一个能够进行三角测量的传感器。

Locations = ComputeVehiclElocations(Bboxes,Sensor);%在视频帧上覆盖检测imgOut = insertVehicleDetections(frame, locations, bboxes);图;imshow (imgOut);

模拟带视频输入的完整传感器

现在您已经了解了各个步骤的内部工作原理,让我们将它们放在一起,并将它们应用到一个视频序列中,在这个序列中我们还可以利用时间信息。

将视频倒回开头,然后对视频进行处理。下面的代码被缩短了,因为所有关键参数都在前面的步骤中定义了。这里只使用参数,不作进一步说明。

videoReader。CurrentTime = 0;isPlayerOpen = true;快照= [];hasFrame (videoReader) & & isPlayerOpen%抓住视频框架框架= ReadFrame(Videoreader);%compute birdseyeview图像birdseyeimage = Transportimage(Birdseyeconfig,框架);Birdseyeimage = IM2Gray(BirdseyeImage);%检测车道边界特征Birdseyeviewbw = segmentlanemarkerridge(Birdseyeimage,BirdseyeConfig,......approxLaneMarkerWidthVehicle,'roi',vevicleroi,......'敏感度',lanesensity);在车辆坐标中获得车道候选点[imagex,imagey] =查找(birdseyeviewbw);xyboundarypoints = ImageTovehicle(Birdseyeconfig,[Imagey,Imagex]);%寻找车道边界候选人[边界,边界点] = FindParaboliclaneBoundaries(XYBoundaryPoints,边界WIDTH,......'maxnumboundaries',maxlanes,“validateBoundaryFcn”,@validateboutbaryfcn);%拒绝基于其长度和力量的边界Isofminlength = Arrayfun(@(b)diff(b.xextent)> minxlength,边界);边界=边界(Isofminlength);Isstrong = [边界.strength]> 0.2 * maxstrength;界限=边界(ISStrong);%划分车道标志类型边界= classifyLaneTypes(边界,边界点);%找到自我车道xOffset = 0;距离传感器0米distancetoboundaries =界限..puteboutbarymodel(xoffset);找出应聘者的自我界限LeftegogoboundaryIndex = [];RightegoboundaryIndex = [];mindlistance = min(distancetoboundaries(distancetoboundaries> 0));minrdistance = max(distancetoboundaries(distancetoboundaries <= 0));如果〜isempty(mindlistance)leftegogogoboundaryindex = distancetoboundaries == mindlistance;结尾如果〜isempty(minrdistance)lightegoboundaryindex = distancetoboundaries == minrdistance;结尾Leftegogoboundary =边界(LetfegogogOwnaryIndex);Rightegoboundary =界限(RightegoboundaryIndex);%检测车辆[Bboxes,Scores] =检测(MonoDetector,Frame);Locations = ComputeVehiclElocations(Bboxes,Sensor);%可视化传感器输出和中间结果。打包核心传感器输出到结构中。sensorOut。leftEgoBoundary = leftEgoBoundary;sensorOut。rightEgoBoundary = rightEgoBoundary;sensorOut。vehicleLocations =位置;sensorOut。xVehiclePoints = bottomOffset: distAheadOfSensor;sensorOut。vehicleBoxes = bboxes;%打包额外的可视化数据,包括中间结果Intout.birdseyeimage = birdseyeimage;Intout.birdseyeconfig = birdseyeconfig;Intout.vehiclycores =得分;Intout.vehicleroi = vevicleroi;Intout.birdseyebw = birdseyeviewbw;closeplayers =〜hasfame(videoreader);Isplayeropen = VisualizesensorResults(帧,传感器,传感器,......Intout,ClosePlayers);时间戳= 7.5333;%获取在timeStamp秒发布的快照如果ABS(VideoreR.Currenttime  - 时间戳)<0.01快照=拍摄照片(框架,传感器,传感器);结尾结尾

显示视频帧。快照拍摄时间戳秒。

如果〜isempty(快照)图imshow(快照)结尾

尝试在不同的视频上的传感器设计

HelperMonosensor类组装设置和所有必要的步骤,以将单眼摄像机传感器模拟成一个可应用于任何视频的完整包装。由于传感器设计使用的大多数参数都基于世界单位,因此设计对摄像机参数的变化具有稳健性,包括图像尺寸。请注意,内部的代码HelperMonosensor类不同于前一节中用于说明基本概念的循环。

除了提供新视频外,您必须提供与该视频相对应的相机配置。此处显示该过程。尝试自己的视频。

%传感器配置焦点= [309.4362,344.2161];林城= [318.9034,257.5352];图像= [480,640];高度= 2.1798;距离地面米的百分比高度距= 14;以学位的相机的%音高Camintrinsics =摄像石(FocalLength,Principalpoint,Imageize);传感器=单纸(Camintrinsics,高度,“音高”、沥青);videoReader = videoReader ('caltech_washington1.avi');

创造HelperMonosensor对象并将其应用于视频。

monoSensor = HelperMonosensor(传感器);monosensor.lanexextentthreshold = 0.5;%要从此视频中的阴影中删除假检测,我们只返回%车辆检测具有更高的分数。monosensor.vehicledetectionthreshold = 20;isPlayerOpen = true;快照= [];hasFrame(videoReader) && isPlayerOpen frame = readFrame(videoReader);%得到一个框架Sensorout = ProcessFrame(MonoSensor,Frame);closeplayers =〜hasfame(videoreader);Isplayeropen = DisplaySensorOutputs(MonoSensor,Frame,Senserout,ClosePlayers);时间戳= 11.1333;%获取在timeStamp秒发布的快照如果ABS(VideoreR.Currenttime  - 时间戳)<0.01快照=拍摄照片(框架,传感器,传感器);结尾结尾

显示视频帧。快照拍摄时间戳秒。

如果〜isempty(快照)图imshow(快照)结尾

万博1manbetx支持功能

可视化符合要求显示单眼相机传感器仿真的核心信息和中间结果。

功能Isplayeropen = VisualizesensorResults(帧,传感器,传感器,......Intout,ClosePlayers)拆开主要输入Leftegoboundary = Sensorout.Leftegoboundary;Rightegoboundary = sensorout.rightegoboundary;位置= sensorout.vehiclelocations;xvehiclepoints = sensorout.xvehiclepoints;bboxes = sensorout.vehicleboxes;%解压缩额外的中间数据birdsEyeViewImage = intOut.birdsEyeImage;birdsEyeConfig = intOut.birdsEyeConfig;vehicleROI = intOut.vehicleROI;birdsEyeViewBW = intOut.birdsEyeBW;%在鸟瞰图中可视化左右自我车道边界birdsEyeWithOverlays = insertLaneBoundary(birdsEyeViewImage, leftEgoBoundary, birdseeconfig, xVehiclePoints,“颜色”'红色');Birdseyeeeewithoverlays = InsertLaneboundary(Birdseyeeeeewithoverlays,Lightegoboundary,Birdseyeconfig,Xvehiclepoints,“颜色”'绿色');%可视化摄像机视图中的自我车道边界FrameWithOverlay = InsertLaneBoundary(框架,左边福克斯,传感器,Xvehiclepoints,“颜色”'红色');framewiththoverlays = insertLaneBoundary(framewiththoverlays, rightgoboundary, sensor, xVehiclePoints,“颜色”'绿色');FrameWithOverlay = InsertveHicledEttions(FrameWithoverlays,Locations,Bboxes);Imageroi = vehicletoimagroomi(birdseyeconfig,vevicleroi);roi = [imageroi(1)imagero(3)imageroi(2)-imagrooi(1)imagero(4)-1magero(3)];突出包含异常值的候选车道点birdseyeviewimage = insertshape(birdseyeviewimage,“矩形”,ROI);显示检测ROIBirdseyeviewImage = imoverlay(BirdseyeviewImage,Birdseyeviewbw,“蓝”);%显示结果frames = {framewiththoverlay, birdsEyeViewImage, birdseyewiththoverlay};持久球员;如果isempty(players) frameames = {“行车标志及车辆侦测”'原始分割'“车道标记检测”};= helperVideoPlayerSet(帧,帧名);结尾更新(球员,框架);%当第一个玩家关闭时终止循环Isplayeropen = Isopen(玩家,1);如果(〜是isplayeropen || closeplayers)%关闭了另一名球员清晰的玩家;结尾结尾

computevehiclecations考虑到图像坐标中的检测算法返回的边界框,计算车辆坐标中的车辆的位置。它返回车辆坐标中边界框底部的中心位置。由于使用单眼摄像机传感器和简单的配合,因此只能计算沿着道路表面的距离。在三维空间中的任意位置计算需要使用立体相机或能够进行三角测量的另一个传感器。

功能Locations = ComputeveHiclElocations(Bboxes,Sensor)位置=零(大小(Bboxes,1),2);对于I = 1:size(bboxes, 1) bbox = bboxes(I,:);%获取[x,y]位置的下半部分的中心%检测边界框,单位为米。Bbox是[x, y,宽度,高度]%图像坐标,其中[x,y]表示左上角。Ybottom = Bbox(2)+ Bbox(4) -  1;Xcenter = Bbox(1)+(Bbox(3)-1)/ 2;%近似中心位置(i,:) = imageToVehicle(sensor, [xCenter, yBottom]);结尾结尾

插入intervehicledets插入边界框并显示与返回的车辆检测相对应的[x,y]位置。

功能IMGOUT = INSERTVEHICLEDECTIONS(IMGIN,LOCATIONS,BBOXES)IMGOUT = IMGIN;对于i = 1:大小(位置,1)位置=位置(i,:);bbox = bboxes(i,:);标签= sprintf('x =%0.2f,y =%0.2f'、位置(1)、位置(2));imgOut = insertObjectAnnotation (imgOut,......“矩形”bbox,标签,“颜色”'G');结尾结尾

vevicletoimageroi.将车辆的ROI转换为鸟瞰图象中的图像坐标。

功能imageROI = vehicleToImageROI(birdsEyeConfig, vehicleeroi)loc2 = abs(vehicleToImage(birdsEyeConfig, [vehicleeroi (2) vehicleeroi (4)]));loc1 = abs(vehicleToImage(birdsEyeConfig, [vehicleeroi (1) vehicleeroi (4)]));loc4 = vehicleToImage(birdsEyeConfig, [vehicleeroi (1) vehicleeroi (4)]);loc3 = vehicleToImage(birdsEyeConfig, [vehicleeroi (1) vehicleeroi (3)]);[minRoiX, maxRoiX, minRoiY, maxRoiY] = deal(loc4(1), loc3(1), loc2(2), loc1(2));imageROI = round([minRoiX, maxRoiX, minRoiY, maxRoiY]);结尾

vignateboutalaryfcn.拒绝使用RANSAC算法计算的一些车道边界曲线。

功能Isgood = ValidateBoundaryFCN(Params)如果〜isempty(params)a = params(1);%拒绝具有小“A”系数的任何曲线,这使得它非常高度%弯曲。isGood = abs(a) < 0.003;来自AX ^ 2 + Bx + C的%a其他的isgood = false;结尾结尾

classificlanetypes.确定车道标记类型为坚固

功能界限= classifylanetypes(边界,边界点)对于绑定= 1:numel(边界)车辆点=边界点{bind};%按x排序车辆点=排名(车辆点,1);Xvehicle =车辆点(:,1);xvehicleunique =独特(xvehicle);%虚线与固体xdiff = diff(xvehicleunique);足够大的阈值以删除点之间的空格%实线,但不足以删除破折号之间的空格xdifft =平均值(xdiff)+ 3 * std(xdiff);大片= xdiff(xdiff> xdifft);%安全默认界限(绑定).Boundarytype = LaneBoundarytype.solid;如果大图> 2理想情况下%,这些间隙应该是一致的,但你不能依赖百分比,除非您知道ROI范围至少包括3个破折号。界限(绑定).Boundarytype = LaneBoundarytype.dashed;结尾结尾结尾

拍卖捕获HTML发布报告的输出。

功能i =拍摄(帧,传感器,传感器)%解压缩输入Leftegoboundary = Sensorout.Leftegoboundary;Rightegoboundary = sensorout.rightegoboundary;位置= sensorout.vehiclelocations;xvehiclepoints = sensorout.xvehiclepoints;bboxes = sensorout.vehicleboxes;FrameWithOverlay = InsertLaneBoundary(框架,左边福克斯,传感器,Xvehiclepoints,“颜色”'红色');framewiththoverlays = insertLaneBoundary(framewiththoverlays, rightgoboundary, sensor, xVehiclePoints,“颜色”'绿色');FrameWithOverlay = InsertveHicledEttions(FrameWithoverlays,Locations,Bboxes);我= FrameWithoverlays;结尾

另请参阅

应用程序

功能

对象

相关主题