配置和使用单纸巾
对象以在视频显示器上显示车辆坐标中提供的信息。
在录制的视频上显示记录在车辆坐标中的数据是地面真理标签和分析跟踪结果的一个组成部分。使用二维鸟瞰图可以帮助您了解整体环境,但有时难以将视频与鸟瞰图显示屏相关联。特别是,当使用第三方传感器时,此问题变得更糟,在其中无法访问由传感器捕获的原始视频,并且您需要使用单独的相机捕获的视频。
自动化驾驶工具箱™提供单纸巾
促进车辆坐标与图像坐标之间转换的对象。此示例读取由安装在测试车辆上的视频传感器记录的数据。然后它显示由安装在同一辆车上的单独摄像机捕获的视频上的数据。数据和视频以下列费率记录:
报告的车道信息:每秒20次
报告的视觉物体:每秒10次
视频帧速率:每秒20帧
当在视频上显示有几个对象时,所选帧对应于视频剪辑中的5.9秒。
%设置视频阅读器和播放器VideoFile =.'01_city_c2s_fcw_10s.mp4';VideoReader = Videoreader(VideoFile);VideoPlayer = Vision.DeployableVideoplayer;%跳转到所需的帧时间= 5.9;VideoReader.Currenttime =时间;framewithoutannotations = ReadFrame(Videoreader);imshow(FrameWithoutAnnotations);标题('原始视频框架')
获取相应的录制数据。
recordingfile ='01_city_c2s_fcw_10s_sensor.mat';[VisionObjects,LaneReports,Timestep,NumSteps] = ReadDetectionSfile(RecordingFile);CurrentStep = Round(时间/时间)+ 1;videodetections = processDetections(VisionObjects(CurrentStep));LaneBoundaries = Processlanes(LaneReports(CurrentStep));%设置用于视频显示的MonoCamera对象传感器= setupmonocamera(录像机);Framewithannotations = UpdateDisplay(FrameWithoutAnnotations,Sensor,VideoTections,LaneBoundaries);imshow(Framewithannotations);标题('注释视频框架')
要使用注释显示视频片段,只需重复逐帧帧帧。该视频表明,汽车略微上下倾斜,从而改变俯仰角。没有尝试弥补这种音高运动。结果,从车辆坐标到图像坐标的转换在一些框架上有点不准确。
%重置时间返回到零currentstep = 0;%重置录制的数据时间Videoreader.Currenttime = 0;%重置视频读者时间尽管CurrentStep%更新方案计数器CurrentStep = CurrentStep + 1;%获得当前时间Tic.%准备对跟踪器的检测videodetections = processDetections(VisionObjects(CurrentStep),videoDetections);%过程车道LaneBoundaries = Processlanes(LaneReports(CurrentStep));%更新视频帧,其中包含来自报告对象的注释framewithoutannotations = ReadFrame(Videoreader);Framewithannotations = UpdateDisplay(FrameWithoutAnnotations,Sensor,VideoTections,LaneBoundaries);%记录的数据以每秒20帧的速率获得。%暂停50毫秒,以获得更现实的显示率。如果你%进程数据和表单曲目在此循环中,您不需要此% 暂停。暂停(0.05 - TOC);%显示注释框架Videoplayer(FrameWithannotations);结尾
这setupmonocamera.
函数返回A.单纸巾
传感器对象,用于将车辆坐标的位置转换为图像坐标。
了解相机的内在和外部校准参数对于像素和车辆坐标之间准确转换至关重要。
首先定义相机内在参数。基于相机模型估计此功能中的参数。要获得相机的参数,请使用相机校准器应用程序。
由于此示例中的数据具有很小的失真,所以该功能忽略了镜头失真系数。接下来的参数存储在a中摄像头
目的。
接下来,定义相机外在内饰。相机外在内饰与相机安装在汽车上的方式。安装包括以下属性:
高度:在地面上安装高度,以米为单位。
俯仰:音频音频,以度为单位,其中正面在地平线和地面上倾斜。在大多数情况下,相机略低于地平线。
滚动:围绕其轴滚动相机。例如,如果视频倒置,请使用Roll = 180。
偏航:相机的角度侧向,积极朝着正面的方向y-axis(向左)。例如,面向前的相机具有0度的横摆角,并且朝向的相机具有180度的横摆角。
功能Sensor = setupmonocamera(vidreader)%从视频信息中定义相机内部内部焦点长度= [1260 1100];%[FX,FY]%像素runcipalpoint = [360 245];%[CX,CY]%像素图像zize = [vidreader.height,vidreader.width];%[numrows,numcolumns]%像素内在=摄像石(FocalLength,Principalpoint,Imageize);%定义相机安装(相机外在)Mountingheight = 1.45;从地面米的%高度MountingPitch = 1.25;以学位的相机的%音高mountingroll = 0.15;%以度为单位卷mountingyaw = 0;相机的%偏航以学位Sensor = Monocamera(内在,Mountingheight,......'沥青',mountingpitch,......'卷',mountingroll,......'偏航',mountingyaw);结尾
这更新
函数在视频帧的顶部显示所有对象注释。
显示更新包括以下步骤:
使用单纸巾
传感器将报告的检测转换为边界框并注释框架。
使用InsertLaneboundary.
方法的方法抛物面普遍
对象插入车道注释。
功能Frame = UpdateDisplay(帧,传感器,videoDetections,LaneBoundaries)%为边界框分配内存bboxes = zeros(numel(videodetections),4);%创建边界框为了i = 1:numel(videodetections)%使用Monocamera传感器将车辆坐标的位置转换为%到图像坐标中的位置。%注意:%1.报告对象的宽度并用于计算对象周围边界框的%大小(每个宽度% 边)。未报告对象的高度。相反,这是%函数使用0.85的高度/宽度为汽车和3%行人。%2.报告的位置位于地面对象的中心%级别,即边界框的底部。Xylocation1 =驾驶仪(传感器,videoDetections(i).positions'+ [0,videoDetections(i).widths / 2]);Xylocation2 = vevicletoImage(传感器,videodetections(i).positions' - [0,videodetections(i).widths / 2]);DX = Xylocation2(1) - Xylocation1(1);%定义了基于对象类的高度/宽度比如果Strcmp(videodetections(i).Labels,'车')Dy = DX * 0.85;eleesifStrcmp(videodetections(i).Labels,'行人')Dy = DX * 3;别的dy = dx;结尾%估计车辆周围的边界框。减去高度%边界框以定义左上角。Bboxes(i,:)= [(Xylocation1 - [0,Dy]),DX,Dy];结尾%添加标签标签= {videodetections(:)。标签}';%将边界框添加到帧如果〜Isempty(标签)帧= InsertObjectAnnotation(帧,'矩形',bboxes,标签,......'颜色'那'黄色'那'字体大小'10,'TextBoxopacity',.8,'行宽',2);结尾%显示视频帧上的车道边界Xrangevehicle = [1,100];xptsinvehicle = linspace(Xrangevehicle(1),Xrangevehicle(2),100)';Frame = InsertLaneBoundary(帧,巷道(1),传感器,Xptsinvehicle,......'颜色'那'红色的');Frame = InsertLaneBoundary(框架,泳道(2),传感器,Xptsinvehicle,......'颜色'那'绿色');结尾
此示例显示了如何创建一个单纸巾
传感器对象并使用它来显示由单独摄像机捕获的视频上的车辆坐标中描述的对象。尝试使用录制的数据和您自己的摄像机。尝试校准相机以创建一个单纸巾
这允许从车辆转换到图像坐标,反之亦然。
readdetectionsfile.- 读取录制的传感器数据文件。记录的数据是单个结构,分为四个塑造
阵列。此示例仅使用以下两个数组:
laneerports.
, 一种塑造
报告车道边界的数组。它有这些领域:剩下
和对
。阵列的每个元素对应于不同的时间表。两个都剩下
和对
是具有这些字段的结构:已验证
那置信度
那边界型
那抵消
那前锋
, 和曲率
。
VisionObjects.
,一个报告检测到的视觉对象的结构数组。它有领域numobjects.
(整数
) 和目的
(塑造
)。阵列的每个元素对应于不同的时间表。目的
是A.塑造
数组,其中每个元素是具有这些字段的单独对象:ID
那分类
那位置(x; y; z)
那速度(Vx; VY; vz)
那尺寸(dx; dy; dz)
。笔记:z = vy = vz = dx = dz = 0
功能[VisionObjects,LaneReports,Timestep,NumSteps] = ReadDetectionSfile(文件名)a = load(strcat(filename));VisionObjects = A.Vision;lanereports = a.lane;%准备一些时间变量Timestep = 0.05;每50毫秒提供%LANE数据numsteps = numel(VisionObjects);%录制的时间点数结尾
processDetections.- 读取记录的视觉检测。此示例仅提取以下属性:
位置:二维[x,y]
车辆坐标阵列
宽度:视频传感器报告的对象的宽度(注意:传感器未报告对象大小的任何其他维度。)
标签:报告的对象分类
功能videodetections = ProcessDetections(VisionData,videoDetections)%视频传感器将分类值报告为整数%根据以下枚举(从0开始)ClassificationValues = {'未知'那“未知的小”那“未知的大”那......'行人'那'自行车'那'车'那'卡车'那'障碍'};%传感器在此帧中报告的对象总数numvideoObjects = VisionData.numobjects;%视频对象仅报告每秒10次,但视频%每秒具有20帧的帧速率。防止注释%闪烁开启和关闭,此函数从上一个返回值如果没有视频对象,则timestep。如果numvideoobjects == 0.如果nargin == 1即使没有以前的值,%返回结果videodetections = struct('职位',{},'标签',{},'宽度',{});结尾返回;别的%准备一个容器,用于视频检测的相关属性videodetections = struct('职位',[],'标签',[],'宽度',[]);为了i = 1:numvideoObjects videoDetections(i).widths = VisionData.Object(i).size(2);videoDetections(i).positions = VisionData.Object(i).position(1:2);videodetections(i).labels = classificationValues {VisionData.Object(i).classification + 1};结尾结尾结尾
Processlanes.- 读取报告的车道信息并将其转换为抛物面普遍
对象。
基于该车道边界laneerports.
从录音。传感器将车道报告为抛物线模型的参数:%
功能LaneBoundaries = Processlanes(LaneReports)%返回处理的车道边界%边界类型信息类型= {“未标记”那'坚硬的'那'虚线'那“未标记”那'bottsdots'那......“未标记”那“未标记”那'doublesolid'};%读取此框架的录制的车道报告Leftlane = LaneReports.left;Rightlane = LaneReports.Right;%为左右车道边界创建抛物线上的对象Leftparams = cast([Leftlane.Curvature,Leftlane.Headingangangle,Leftlane.Offset],'双倍的');左边的偏出=抛物线(Letfparams);LeftBoundaries.BoundaryType =类型{Leftlane.BoundaryType};RightParams = Cast([rightlane.Curvature,RightLane.Headingangle,RightLane.offset],'双倍的');右翼=抛物面=抛物线(RightParams);RightBoundaries.boundarytype =类型{rightlane.boundarytype};LaneBoutnaries = [Leftboundaries,RightBoundaries];结尾