单目相机的视觉感知

这个例子展示了如何构建一个单目摄像机传感器仿真能够车道边界和车辆检测。传感器将在车辆坐标系中报告这些检测结果。在本例中,您将了解自动驾驶工具箱™使用的坐标系统,以及设计样本单目摄像机传感器所涉及的计算机视觉技术。

概述

包含ADAS功能的车辆或被设计为完全自主依赖于多个传感器。这些传感器可以包括声纳,雷达,激光雷达和相机。该示例说明了各种涉及单眼摄像机系统的概念。这样的传感器可以实现许多任务,包括:

  • 车道边界检测

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

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

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

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

定义相机配置

了解摄像机的内部和外部校准参数对于像素和车辆坐标之间的精确转换至关重要。

首先定义相机的固有参数。以下参数是先前使用使用棋盘格校准模式的摄像机校准程序确定的。你可以使用相机校准器(计算机视觉工具箱)应用程序为您的相机获取它们。

焦点= [309.4362,344.2161];% [fx, fy]以像素为单位林城= [318.9034,257.5352];以像素坐标中的%[CX,CY]光学中心图像= [480,640];%[nrows,mcols]

注意,忽略镜头失真系数,因为数据中的失真很小。参数存储在a中摄像头(计算机视觉工具箱)目的。

camIntrinsics = cameraIntrinsics(focalLength, principalPoint, imageSize);

接下来,定义相对于车辆机箱的相机方向。您将使用此信息来建立相机外在的内在内在的外在基础,该外在内在的基于车辆坐标系的位置。

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

以上量可以从旋转返回的旋转和翻译矩阵中得出外在(计算机视觉工具箱)功能。俯仰指定从水平位置的相机的倾斜度。对于在该示例中使用的相机,传感器的卷和偏航均为零。定义内在内部和外部的整个配置存储在monoCamera目的。

传感器= moncamera (camIntrinsics, height,'沥青', 沥青);

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

缺省情况下,坐标系的原点在地面上,直接在相机的焦点定义的相机中心下方。可以通过使用来移动原点SensorLocation财产的财产monoCamera目的。此外,monoCamera提供了imageToVehicle汽车影像在图像和车辆坐标系之间转换的方法。

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

加载视频帧

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

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

videoName =“加州理工学院科尔多瓦1.avi”;videoReader = videoReader (videoName);

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

时间戳= 0.06667;从视频开始时%的时间VideoReader.CurrenTtime =时间戳;%点到所选帧框架= ReadFrame(Videoreader);%读数秒为%读取帧imshow(框架)%显示框架

注意:此示例忽略镜头失真。如果您担心镜头失真引入的距离测量中的错误,此时您将使用undistortImage(计算机视觉工具箱)功能以消除镜头失真。

创建鸟瞰图图像

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

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

%使用车辆坐标,定义区域变换distaheadofsensor = 30;%以米为单位,如之前在单摄像机高度输入中所规定spaceToOneSide = 6;%所有其他距离量也以米为单位bottomofoffset = 3;Outview = [底部OFFSET,DistaheadofSensor,--spacetoonide,Spacetoonide];% [xmin, xmax, ymin, ymax]imageSize = [NaN, 250];%输出图像宽度为像素;自动选择高度以保护每个像素比为单位birdsEyeConfig=birdsEyeView(传感器、outView、图像大小);

生成鸟瞰图象。

birdsEyeImage = transformImage(birdseeconfig, frame);图imshow(birdseyeimage)

离传感器越远的区域就越模糊,因为像素更少,因此需要更多的插值。

请注意,您可以在不使用鸟瞰图的情况下完成后一种处理步骤,只要您可以在车辆坐标中找到车道边界候选像素即可。

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

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

以下功能的大多数输入参数都是以世界单位指定的,例如,输入的车道标记宽度SementLanemarkerridge..使用世界单位可以让你轻松地尝试新的传感器,即使当输入图像的大小改变。这是非常重要的,以使设计更加健壮和灵活的方面,不断变化的相机硬件和处理不同的标准,在许多国家。

%转换为灰度birdsEyeImage = rgb2gray (birdsEyeImage);世界单位的%车道标记分割ROI= outView - [- 1,2, - 3,3];%向左和向右看3米,在传感器前面看4米大约allanemarkerwidthvehicle = 0.25;%25厘米%检测车道特征laneSensitivity=0.25;birdsEyeViewBW=分段LaneMarkerRidge(birdsEyeImage、birdsEyeConfig、approxLaneMarkerWidthVehicle、,......'roi',vevicleroi,'灵敏度',lanesensity);图imshow(birdseyeviewbw)

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

车道模型沿着车辆路径持有车道标记。穿过沥青上涂上的路径或道路标志的车道标记被拒绝。

%获得车辆坐标的车道候选点[imageX, imageY] = find(birdsEyeViewBW);xyBoundaryPoints = imageToVehicle(birdsEyeConfig, [imageY, imageX]);

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

将边界及其抛物线参数(A,B,C)返回parabolicLaneBoundary物体,边界

maxLanes = 2;寻找最多两个车道标志边界= 3 *大约alanemarkerwidthvehicle;%展开边界宽度[边界,边界点] = 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));将图像点转换为车辆点vehiclePoints = imageToVehicle (birdsEyeConfig [laneImageX (:), laneImageY (:)));%查找任何车道可能的唯一x轴位置的最大数量%的边界maxPointsInOneLane =元素个数(独特(vehiclePoints (: 1)));%将车道边界的最大长度设置为ROI长度maxLaneLength = diff (vehicleROI (1:2));%计算此图像大小/ROI大小的最大可能车道强度% 规格maxstrength = maxpointsinonelane / maxlanelength;%拒绝弱边界Isstrong = [边界.strength]> 0.4 * maxstrength;界限=边界(ISStrong);

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

边界=classifyLaneTypes(边界、边界点);如果存在,%会找到两个自我车道xoffset = 0;距离传感器0米distancetoboundaries =界限..puteboutbarymodel(xoffset);%找到候选人的自我边界leftEgoBoundaryIndex = [];rightEgoBoundaryIndex = [];minLDistance = min (distanceToBoundaries (distanceToBoundaries > 0));minRDistance = max (distanceToBoundaries (distanceToBoundaries < = 0));如果〜isempty(mindlistance)leftegogogoboundaryindex = distancetoboundaries == mindlistance;结束如果〜isempty(minrdistance)lightegoboundaryindex = distancetoboundaries == minrdistance;结束leftEgoBoundary =边界(leftEgoBoundaryIndex);rightEgoBoundary =边界(rightEgoBoundaryIndex);

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

xvehiclepoints =底部OFFSET:DistaheadofSensor;birdseyeeewithegolane = Insertlaneboundary(BirdseyeImage,Letegoboundary,BirdseyeConfig,Xvehiclepoints,'颜色'“红色”); birdsEyeWithEgoLane=插入LaneBoundary(birdsEyeWithEgoLane、右EgoBoundary、birdsEyeConfig、X车辆点、,'颜色''绿色的'); frameWithEgoLane=插入Lane基础(框架、左EgoBoundary、传感器、X车辆点、,'颜色'“红色”);FrameWitheGolane = InsertLaneBoundary(FrameWitheGolane,Lightegoboundary,Sensor,XvehiclePoints,'颜色''绿色的');图形子图('位置',[0,0,0.5,1.0])%[左、下、宽、高]标准化单位imshow(birdseyewithegolane)子图('位置',[0.5,0,0.5,1.0])Imshow(FrameWithegolane)

在车辆坐标中定位车辆

在前碰撞警告(FCW)和自动紧急制动(AEB)系统中,检测和跟踪车辆至关重要。

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

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

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

Monodetector = CodentEcTeCtormOnodamera(探测器,传感器,车辆宽);[Bboxes,Scores] =检测(MonoDetector,Frame);

由于此示例显示了如何仅处理单个帧进行演示,所以不能在原始检测的基础上应用跟踪。添加跟踪使返回车辆位置的结果更加可靠,因为即使车辆被部分遮挡,跟踪器也会继续返回车辆位置。有关更多信息,请参阅使用相机跟踪多辆车辆例子。

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

locations = computeVehicleLocations(bboxes, sensor);%将检测覆盖在视频帧上imgout =插入intervehicledentions(帧,位置,bboxes);数字;imshow(imgout);

模拟一个完整的传感器与视频输入

既然您对个人步骤的内部工作有了一个想法,让我们将它们放在一起,将它们应用于视频序列,我们也可以利用时间信息。

将视频倒带到开头,然后处理视频。以下代码缩短,因为所有关键参数都是在前面的步骤中定义的。在这里,使用这些参数,无需进一步解释。

videoReader.CurrentTime=0;isPlayerOpen=true;快照=[];尽管hasfame(videoreader)&&ispereropen%抓住视频框架框架= ReadFrame(Videoreader);%计算birdsEyeView图像birdsEyeImage = transformImage(birdseeconfig, frame);birdsEyeImage = rgb2gray (birdsEyeImage);%检测车道边界特征Birdseyeviewbw = segmentlanemarkerridge(Birdseyeimage,BirdseyeConfig,......大约allanemarkerwidthvehlicle,'roi',vevicleroi,......'灵敏度',lanesensity);%获得车辆坐标的车道候选点[imageX, imageY] = find(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);%Classify Lane标记类型边界=classifyLaneTypes(边界、边界点);%找到自我车道xoffset = 0;距离传感器0米distancetoboundaries =界限..puteboutbarymodel(xoffset);%找到候选人的自我边界leftEgoBoundaryIndex = [];rightEgoBoundaryIndex = [];minLDistance = min (distanceToBoundaries (distanceToBoundaries > 0));minRDistance = max (distanceToBoundaries (distanceToBoundaries < = 0));如果〜isempty(mindlistance)leftegogogoboundaryindex = distancetoboundaries == mindlistance;结束如果〜isempty(minrdistance)lightegoboundaryindex = distancetoboundaries == minrdistance;结束leftEgoBoundary =边界(leftEgoBoundaryIndex);rightEgoBoundary =边界(rightEgoBoundaryIndex);%检测车辆[bboxes, scores] = detect(monoDetector, frame);locations = computeVehicleLocations(bboxes, sensor);可视化传感器输出和中间结果。包的核心%传感器输出到结构中。sensorOut.leftEgoBoundary=leftEgoBoundary;sensorOut.rightEgoBoundary=rightEgoBoundary;传感器输出。车辆位置=位置;sensorOut.xVehiclePoints=底部偏移量:距离传感器前端;sensorOut.vehicleBoxes=B盒;%包附加可视化数据,包括中间结果Intout.birdseyeimage = birdseyeimage;Intout.birdseyeconfig = birdseyeconfig;Intout.vehiclycores =得分;Intout.vehicleroi = vevicleroi;Intout.birdseyebw = birdseyeviewbw;closeplayers =〜hasfame(videoreader);Isplayeropen = VisualizesensorResults(帧,传感器,传感器,......Intout,ClosePlayers);时间戳= 7.5333;%在时间戳秒处拍摄快照以进行发布如果ABS(VideoreR.Currenttime  - 时间戳)<0.01快照=拍摄照片(框架,传感器,传感器);结束结束

显示视频帧。快照是在时间戳秒。

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

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

helperMonoSensor类组装了设置和所有必要的步骤,以模拟单目摄像机传感器到一个完整的包,可以应用于任何视频。由于传感器设计中使用的大多数参数都是基于世界单位的,因此该设计对摄像机参数(包括图像大小)的变化具有鲁棒性。的代码helperMonoSensor类与上一节中用于说明基本概念的循环不同。

除了提供一个新的视频外,您还必须提供与该视频相对应的摄像机配置。流程如下所示。在你自己的视频中试试。

%传感器配置焦点= [309.4362,344.2161];林城= [318.9034,257.5352];图像= [480,640];高度= 2.1798;距离地面米的百分比高度间距= 14;以学位的相机的%音高camIntrinsics = cameraIntrinsics(focalLength, principalPoint, imageSize);传感器= moncamera (camIntrinsics, height,'沥青',音高);视频阅读器('caltech_washington1.avi');

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

monoSensor = HelperMonosensor(传感器);monosensor.lanexextentthreshold = 0.5;%要从此视频中的阴影中删除假检测,我们只返回%车辆检测具有更高的分数。monosensor.vehicledetectionThreshold = 20;Isplayeropen = true;Snapshot = [];尽管Hasfame(Videoreader)&& ISPlayeropen Frame = ReadFrame(Videoreader);得到一个帧Sensorout = ProcessFrame(MonoSensor,Frame);closeplayers =〜hasfame(videoreader);Isplayeropen = DisplaySensorOutputs(MonoSensor,Frame,Senserout,ClosePlayers);时间戳= 11.1333;%在时间戳秒处拍摄快照以进行发布如果ABS(VideoreR.Currenttime  - 时间戳)<0.01快照=拍摄照片(框架,传感器,传感器);结束结束

显示视频帧。快照是在时间戳秒。

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

金宝app支持功能

visualizeSensorResults显示单眼相机传感器仿真的核心信息和中间结果。

功能Isplayeropen = VisualizesensorResults(帧,传感器,传感器,......Intout,ClosePlayers)%解压缩主输入Leftegoboundary = Sensorout.Leftegoboundary;Rightegoboundary = sensorout.rightegoboundary;位置= sensorout.vehiclelocations;xvehiclepoints = sensorout.xvehiclepoints;bboxes = sensorout.vehicleboxes;%解包额外的中间数据BirdseyeviewImage = Intout.BirdseyeImage;birdseyeconfig = Intout.birdseyeconfig;vevicleroi = Intout.vehicleroi;birdseyeviewbw = Intout.birdseyebw;%在鸟瞰图中可视化左右自我车道边界birdsEyeWithOverlays=插入LaneBoundary(birdsEyeViewImage、leftEgoBoundary、birdsEyeConfig、xVehiclePoints、,'颜色'“红色”);Birdseyeeeewithoverlays = InsertLaneboundary(Birdseyeeeeewithoverlays,Lightegoboundary,Birdseyeconfig,Xvehiclepoints,'颜色''绿色的');%在摄像机视图中可视化自我通道边界FrameWithOverlay = InsertLaneBoundary(框架,左边福克斯,传感器,Xvehiclepoints,'颜色'“红色”); frameWithOverlays=插入LaneBondary(frameWithOverlays,右侧电子边界,传感器,X车辆点,'颜色''绿色的');framewithoverlay = insertVehicleDetections(framewithoverlay, locations, bboxes);imageROI = vehicleToImageROI(birdsEyeConfig, vehicleeroi);ROI = [imageROI(1) imageROI(3) imageROI(2)-imageROI(1) imageROI(4)-imageROI(3)];%突出显示包括异常值的候选车道点birdsEyeViewImage = insertShape (birdsEyeViewImage,“矩形”ROI);%显示检测ROI= imoverlay(birdsEyeViewImage, birdsEyeViewBW,'蓝色的');%显示结果框架= {framewithoverlay,birdseyeviewimage,birdseyeeeeewithoverlays};持续的球员;如果isempty(球员)framenames = {'车道标记和车辆检测'“原始分割”'车道标记检测'}; players=helperVideoPlayerSet(帧、帧名称);结束更新(播放器、帧);%当第一个玩家关闭时终止循环Isplayeropen = Isopen(玩家,1);如果(~ isPlayerOpen | | closePlayers)%关闭了另一名球员清除玩家结束结束

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

功能Locations = ComputeveHiclElocations(Bboxes,Sensor)位置=零(大小(Bboxes,1),2);i = 1:大小(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,:)=图像到车辆(传感器,[xCenter,yBottom]);结束结束

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

功能imgOut = insertVehicleDetections(imgIn, locations, bboxes)i = 1:大小(位置,1)位置=位置(i,:);bbox = bboxes(i,:);标签= sprintf('x =%0.2f,y =%0.2f',位置(1),位置(2));imgOut=插入对象注释(imgOut,......“矩形”,bbox,label,'颜色''G');结束结束

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

功能图像ROI=车辆图像ROI(鸟眼配置,车辆ROI)车辆ROI=双倍(车辆ROI);loc2=abs(车辆图像(鸟眼配置,[vehicleROI(2)vehicleROI(4)]);loc1=abs(车辆图像(鸟眼配置,[vehicleROI(1)vehicleROI(4)]);loc4=车辆图像(鸟眼配置[vehicleROI(1)vehicleROI(4)];loc3=车辆图像(鸟眼配置[vehicleROI(1)vehicleROI(3)][minRoiX,maxRoiX,Minroy,Maxroy]=交易(loc4(1)、loc3(1)、loc2(2)、loc1(2));imageROI=圆形([minRoiX,maxRoiX,MinRoy,MaxRoy]);结束

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

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

classificlanetypes.确定车道标记类型固体虚线, 等等。

功能界限= classifylanetypes(边界,边界点)绑定= 1:numel(边界)车辆点=边界点{bind};按x排序车辆点=排名(车辆点,1);Xvehicle =车辆点(:,1);xvehicleunique =独特(xvehicle);%虚线vs实线xdiff = diff(xvehicleunique);%足够大的阈值,以删除%实线,但不足以删除破折号之间的空间xdifft =平均值(xdiff)+ 3 * std(xdiff);大片= xdiff(xdiff> xdifft);%安全默认值界限(绑定).Boundarytype = LaneBoundarytype.solid;如果largeGaps > 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,'颜色'“红色”); frameWithOverlays=插入LaneBondary(frameWithOverlays,右侧电子边界,传感器,X车辆点,'颜色''绿色的');framewithoverlay = insertVehicleDetections(framewithoverlay, locations, bboxes);我= FrameWithoverlays;结束

另请参阅

应用

功能

对象

相关话题