主要内容

使用摄像头跟踪多辆车

此示例显示了如何使用安装在车辆中的单眼摄像机检测和跟踪多个车辆。

概述

自动化驾驶工具箱™提供佩带的车辆探测器和多目标跟踪器,以便于围绕自助车辆跟踪车辆。车辆检测器基于ACF特征和更快的R-CNN,基于深度学习的物体检测技术。探测器可以容易地互换,以便看到它们对车辆跟踪的影响。

跟踪工作流包括以下步骤:

  1. 定义相机内在镜和相机安装位置。

  2. 负载并配置预制的车辆检测器。

  3. 建立一个多目标跟踪器。

  4. 为每个视频帧运行探测器。

  5. 用检测结果更新跟踪器。

  6. 以视频方式显示跟踪结果。

配置车辆检测器和多目标跟踪器

在此示例中,您使用预级丙累折的ACF车辆检测器并配置该检测器以合并相机信息。默认情况下,检测器以多个尺度扫描整个图像。通过了解相机参数,您可以在合理的尺度上配置检测器以检测地面平面上的车辆。

%加载包含相机信息的Monocamera对象。d = load(“FCWDemoMonoCameraSensor.mat”'传感器');%加载普拉的ACF车辆检测器。ACF探测器使用“聚合%频道功能“,在实践中快速计算。”全视图“%模型训练的图像的前,后,左,右%的车辆。探测器=车辆levedetectoracf('全景');

要尝试更快的R-CNN车辆探测器,请使用vehicleDetectorFasterRCNN反而。该探测器需要深入学习工具箱™许可证。

使用传感器信息配置检测器。检测器只试图在地面平面上方的图像区域找到车辆。这可以减少计算并防止虚假检测。

%普通车辆的宽度在1.5 - 2.5米之间。只有一个在此范围内宽度为%的边界框被认为是一个检测图像中的%候选人。车辆Width = [1.5,2.5];%使用单纸片传感器和所需宽度配置检测器。探测器= MOITIONTECTECTORMONOCamera(探测器,D.Sensor,车辆宽);%初始化包括设置过滤器的多目标跟踪器,%检测到跟踪分配阈值,滑行和%确认参数。您可以找到| setuptracker |功能在职能%结束了这个例子。[跟踪器,posityselector] = setuptracker();

视频中的轨道车辆

在每个时间步骤中,运行检测器,使用检测结果更新跟踪器,并显示视频中的跟踪结果。

%安装视频阅读器和播放器VideoFile =.“05 _highway_lanechange_25s.mp4”;VideoReader = Videoreader(VideoFile);Videoplayer = Vision.deployableVideoplayer();CurrentStep = 0;Snapshot = [];Snaptimestamp = 120;cont = hasfame(Videoreader);尽管%更新帧计数器。CurrentStep = CurrentStep + 1;%读取下一个帧。框架= ReadFrame(Videoreader);%运行检测器并将返回的结果打包到一个对象中MultiObjectRacker所需的%。您可以找到|探测器|此示例结束时%函数。检测=探测器(探测器,帧,CurrentStep);%使用ObjectDetections列表,返回曲目,更新%'chancusstep'时间。确认技术= UpdateTracks(跟踪器,检测,CusthStep);移除远处车辆的履带。ChalicDedTracks = Removenoisytracks(确认有关,PositeSelector,D.Sensor.Intrinsics.imagesize);%插入跟踪注释。FrameWithannotations = InsertTrackboxes(帧,确认托架,PositySelector,D.Sensor);%显示注释框架。Videoplayer(FrameWithannotations);%拍摄SnaptimeStamp秒发布的快照如果currentstep == snaptimestamp snapshot = framewithannotations;结尾如果用户关闭视频播放器图,则%退出循环。cont = hasfame(VideoReader)&& Inopen(VideoPlayer);结尾

显示跟踪车辆并显示到自助式车辆的距离。

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

图中包含一个坐标轴。轴包含一个image类型的对象。

这里提出的跟踪工作流可以很容易地集成到使用单眼相机的视觉感知例如,车辆检测步骤可以增强与跟踪器。要了解自动驾驶工具箱™中的其他跟踪功能,请参见单纸巾MultiObjectTracker.

金宝app支持功能

setuptracker.功能创建A.MultiObjectTracker.跟踪带有Kalman过滤器的多个对象。创建A.MultiObjectTracker.考虑以下:

  • FilterInitializationFCN.:可能的运动和测量模型。在这种情况下,预期对象具有恒定的速度运动。请参阅“定义卡尔曼筛选器”部分。

  • 分配察觉:检测到轨道有多远。此参数的默认值为30.如果有未分配追踪的检测,但应该是,增加此值。如果有分配给太远的曲目的检测,则降低此值。此示例使用50。

  • deletionthreshold.:在删除之前,曲目在最后Q步骤中不会分配检测(错过)的次数。滑行是一个用于更新轨道而不分配的检测(预测)的术语。此参数的默认值为5以下5个未命中5个上次更新。

  • 确认察觉:确认轨道的参数。使用每个未分配的检测初始化新曲目。这些检测中的一些可能是假的,因此所有曲目都被初始化为暂定的.要确认一个轨迹,至少要检测到它m时代N跟踪器更新。选择mN取决于物体的可见度。本例使用默认的5次更新中的3次检测。

的输出setuptracker.是:

  • 跟踪器- - -MultiObjectTracker.配置为此案例。

  • 位置选择- 指定状态向量的哪个元素的矩阵:position = positionSelector * State

功能[跟踪器,positeSelector] = setuptracker()%创建跟踪器对象。Tracker = MultiObjectTracker('filterinitializationfcn',@initbboxfilter,......'AssignmentThreshold',50,......“DeletionThreshold”5,......'确认察觉'[3 - 5]);%状态向量为:[x;vx;y;v;w;大众;h;vh)% [x;y;w;h] =位置选择器*状态PositionSelector = [1 0 0 0 0 0 0 0;......0 0 1 0 0 0 0 0;......0 0 0 1 1 0 0 0;......0 0 0 0 0 0 0 1 0];结尾

initbboxfilter.功能定义了kalman滤波器以过滤边界框测量。

功能过滤器= initBboxFilter(检测)%步骤1:定义运动模型和状态。%使用图像上边界框的恒定速度模型。%状态为[x;vx;y;v;w;西弗吉尼亚州;h;高压)%Transition矩阵是:% [1 dt 0 0 0 0 0 0;%0 1 0 0 0 0 0 0;%0 0 0 1 dt 0 0 0 0;%0 0 0 0 1 0 0 0 0;%0 0 0 0 0 1 DT 0 0;%0 0 0 0 0 0 1 0 0;%0 0 0 0 0 0 0 1 dt;%0 0 0 0 0 0 0 0 1]%假设dt = 1。本例不考虑时变转换线性卡尔曼滤波器的%模型。dt = 1;cvel = [1 dt;0 1];a = blkdiag(cvel,cvel,cvel,cvel);%步骤2:定义过程噪声。过程噪声表示过程中模型的各个部分%不被考虑在内。例如,在匀速模型中,%加速忽略了。g1d = [dt ^ 2/2;DT];Q1D = G1D * G1D';Q = Blkdiag(Q1D,Q1D,Q1D,Q1D);步骤3:定义度量模型。%仅测量位置([x; y; w; h])。%测量模型为H = [1 0 0 0 0 0 0 0;......0 0 1 0 0 0 0 0;......0 0 0 1 1 0 0 0;......0 0 0 0 0 0 0 1 0];%步骤4:将传感器测量值映射到初始状态向量。%因为没有测量速度,V组件是%初始化为0:州= [检测.Measurentement(1);......0;......检测.Measurentem(2);......0;......检测.Measurentement(3);......0;......检测.Measurentement(4);......0);步骤5:将传感器测量噪声映射到一个状态协方差。%对于传感器直接测量的状态部分,使用%相应的测量噪声分量。对于部分的部分%传感器不测量,假设初始状态协方差较大。通过这种方式,%未来的检测可以分配到轨道。l = 100;%大值statecov = diag([检测.measurementnoise(1,1),......我,......Detection.MeasurementNoise (2, 2),......我,......检测.MeasurementNoise(3,3),......我,......检测.MeasurementNoise(4,4),......l];%步骤6:创建正确的过滤器。%在这个例子中,所有模型都是线性的,所以使用trackingkf作为%跟踪过滤器。过滤器= trackingKF (......'stateveransitionmodel', 一种,......'MeasurementModel', H,......“状态”, 状态,......'statecovariance',Statecov,......'MeasurementNoise'、检测。measurementNoise,......'processnoise',q);结尾

探测器功能检测图像中的车辆。

功能detections = detectObjects(detector, frame, frameCount)%运行探测器并返回边界框的列表:[x,y,w,h]Bboxes =检测(探测器,帧);%定义测量噪声。l = 100;MeasurementNoise = [L 0 0 0;......0 l 0 0;......0 0 L / 2 0;......0 0 0 L / 2];%表示检测为objectDetection报告列表。numdetections = size(bboxes,1);检测=小区(NumDetections,1);为了i = 1:numdetections检测{i} = ObjectDetection(frameCount,bboxes(i,:),......'MeasurementNoise', measurementNoise);结尾结尾

Removenoisytracks.函数去除噪声轨道。如果预测的边界框太小,则认为轨道是有噪声的。通常情况下,这意味着车辆在很远的地方。

功能tracks = removeNoisyTracks(tracks, positionSelector, imageSize)如果Isempty(轨道)返回结尾%提取所有轨道的位置。位置= getTrackpositions(轨道,位置选择);如果预测位置将要移出,轨迹是“无效的”图像的百分比,或者界定框太小。无效=(位置(:,1)<1 |......位置(:,1)+位置(:,3)>图像化(2)|......位置(:,3)<= 20 |......位置(:,4)<= 20);曲目(无效)= [];结尾

insertTrackboxes.在图像中插入边界框,并在世界单位中显示汽车前面的轨道位置。

功能I = insertTrackBoxes(I, tracks, positionSelector, sensor)如果Isempty(轨道)返回结尾%分配内存。标签=单元格(Numel(轨道),1);%检索边界框的位置。bboxes = getTrackpositions(曲目,位置选择);为了i = 1:numel(曲目)框= bboxes(i,:);使用moncamera对象转换为车辆坐标。Xyvehicle = Imagetovehicle(传感器,[框(1)+盒(3)/ 2,盒子(2)+盒(4)]);标签{i} = sprintf('x =%。1f,y =%。1f',Xyvehicle(1),Xyvehicle(2));结尾i = InsertObjectAnnotation(I,'矩形',bboxes,标签,“颜色”'黄色'......'字体大小'10,'TextBoxopacity'8,“线宽”,2);结尾

也可以看看

功能

对象

相关话题