该程序运行环境为MATLAB R2018A。本例简单讲解如何使用安装在车辆中的单目相机检测和追踪多辆车。
MATLAB的自动驾驶系统工具箱Automated Driving System Toolbox提供了经过预训练的车辆检测器和多目标追踪器(multi-object tracker),以便在自驾汽车周围追踪车辆。车辆检测器基于ACF特征和Faster R-CNN网络。
追踪流程主要包括以下步骤:
1.定义相机内参和相机安装位置
2.加载并配置预训练的车辆检测器
3.设置多目标追踪器。
4.为每个视频帧进行检测
5.使用检测结果更新追踪器。
6.显示追踪结果。
配置车辆检测器和多目标追踪器
在本例中,使用预训练的ACF车辆检测器,并配置此检测器以包含摄像头信息。默认情况下,检测器以多种比例扫描整张图像。
加载包含相机信息的monoCamera对象。
d = load('FCWDemoMonoCameraSensor.mat', 'sensor');
加载预训练的ACF车辆检测器
detector = vehicleDetectorACF('full-view');
使用单目相机信息配置检测器
普通车辆的宽度在1.5至2.5米之间。只有此范围内宽度的边界框被视为candidate
vehicleWidth = [1.5, 2.5];
配置检测器
detector = configureDetectorMonoCamera(detector, d.sensor, vehicleWidth);
初始化多目标追踪器
[tracker, positionSelector] = setupTracker();
在视频中追踪车辆
在每个时间步长中,运行检测器,使用检测结果更新追踪器,并在视频中显示追踪结果。
设置视频读取器和播放器
videoFile = '05_highway_lanechange_25s.mp4';
videoReader = VideoReader(videoFile);
videoPlayer = vision.DeployableVideoPlayer();
currentStep = 0;
snapshot = [];
snapTimeStamp = 120;
cont = hasFrame(videoReader);
while cont
% 更新帧计数器
currentStep = currentStep + 1;
% 读取下一帧
frame = readFrame(videoReader);
% 运行检测器
detections = detectObjects(detector, frame, currentStep);
confirmedTracks = updateTracks(tracker, detections, currentStep);
% 移除远处车辆的轨迹
confirmedTracks = removeNoisyTracks(confirmedTracks, positionSelector, d.sensor.Intrinsics.ImageSize);
frameWithAnnotations = insertTrackBoxes(frame, confirmedTracks, positionSelector, d.sensor);
% 显示
videoPlayer(frameWithAnnotations);
if currentStep == snapTimeStamp
snapshot = frameWithAnnotations;
end
cont = hasFrame(videoReader) && isOpen(videoPlayer);
end
显示追踪的车辆并显示到自驾车的距离。
if ~isempty(snapshot)
figure
imshow(snapshot)
end
其中:
setupTracker函数创建一个多目标追踪器,使用卡尔曼滤波器追踪多个对象。
initBboxFilter函数定义了一个卡尔曼滤波器对边界框测量值进行滤波。
detectObjects函数检测图像中的车辆。
removeNoisyTracks函数去除嘈杂的轨迹。如果轨迹的预测边界框太小,则认为该轨迹是有噪声的。通常,这意味着车辆很远。
insertTrackBoxes函数在图像中插入边界框。
代码如下
https://mianbaoduo.com/o/bread/Y5mZl5Zv