使⽤MATLAB的KalmanFilter做⽬标跟踪——来⾃MathWorks
⽹站的技术⽂档
⽬录
1.前⾔
本⽂来⾃MathWorks官⽅的技术⽂档——。在⾃⼰理解的基础上翻译了部分英⽂注释,并添加了⼀些注释。有关卡尔曼滤波的基本原理,可以参考B站UP主的视频“”。其他可能会⽤到的资料,以及我整理好的.m⽂件放在⽂章的最后。
2.正⽂
2.1 介绍
卡尔曼滤波(Kalman filter)在机电控制、导航、计算机视觉以及时间序列计量经济学等领域具有⼴泛的应⽤。MathWorks的官⽅技术⽂档中介绍了如何使⽤卡尔曼滤波器进⾏⽬标跟踪,主要聚焦于以下⼏个⽅⾯。
1. ⽬标将来将来位置的预测(轨迹预测);
2. 减少由于噪声导致的探测不准确;
3. 促进多⽬标轨迹相互关联的过程(这个还不太明⽩什么意思)。
2.2 ⽬标跟踪的挑战
这⾥给了⼀段视频,可以在C:\Program Files\MATLAB\R20**\toolbox\vision\visiondata⽂件夹中到,⽂件名
为“singleball.mp4”。视频中有⼀个⼩球从画⾯左端运动到画⾯右端,如下:
singleball.mp4
可以使⽤说明中的“showDetections()”函数显⽰该视频,showDetections()函数的.m⽂件也附在最后。
showDetections();
showDetections()函数处理后,⼩球显⽰为⼀团⾼亮的⽩⾊像素,showDetections()调⽤了前景检测函数,可以检测静⽌相机拍摄图像中的前景对象。检测后的视频如下:
singleBall1.avi
前景检测由于球的边缘和地板的对⽐度⽐较低,引⼊了噪声,因此只能检测到球的⼀部分。把所有帧叠加到单幅图⽚上可以得到检测到的⼩球轨迹,如下图。
检测结果暴露了两个问题:
1. 检测得到的区域中⼼与球的中⼼不完全重合,定位球的位置的时候存在误差;
2. 并不是时刻都能检测到球的位置,⽐如当球被箱⼦遮挡的时候。
上述两个问题可以通过卡尔曼滤波来解决。
2.3 使⽤卡尔曼滤波器跟踪单个⽬标
函数trackSingleObject 展⽰了如何实现上述功能,包括:
1. 使⽤configureKalmanFilter创建卡尔曼滤波器;
2. 使⽤预测和矫正的⽅法消除跟踪系统中存在的误差;
3. 当⼩球被遮挡时,使⽤预测⽅法估计⼩球的位置。
使⽤configureKalmanFilter可以简化卡尔曼滤波器构造的过程。trackSingleObject 函数中还包含了⼀些内嵌函数,⽤于实现部分功能。下⾯的全局变量⽤于在主函数和各个嵌套函数中传递数据。
如何做网址frame = []; % A video frame
detectedLocation = []; % The detected location
trackedLocation = []; % The tracked location
label = ''; % Label for the ball
utilities = []; % Utilities used to process the video
跟踪单个⽬标使⽤的trackSingleObject 函数的主体部分如下(还有些嵌套的⼦函数在后⾯单独列出来):
function trackSingleObject(param)
% Create utilities used for reading video, detecting moving objects,
% and displaying the results. 如上,创建⽤于读取视频,⽬标检测以及显⽰结果的实⽤程序。
utilities = createUtilities(param); %创建⼀个⽤于读取视频,显⽰视频,提取前景对象以及分析连接组件的系统对象(system object)
isTrackInitialized = false;
while hasFrame(utilities.videoReader) %hasFrame⽤于确定是否有可⽤的视频帧可供读取,如有,继续
frame = readFrame(utilities.videoReader);
% Detect the ball.
[detectedLocation, isObjectDetected] = detectObject(frame);
if ~isTrackInitialized
if isObjectDetected
% Initialize a track by creating a Kalman filter when the ball is
% detected for the first time.
%如英⽂所述,如果检测到第⼀个⽬标,初始化卡尔曼滤波器(Kalman filter)
%最后三个依次是P,Q,R矩阵
initialLocation = computeInitialLocation(param, detectedLocation);
kalmanFilter = ionModel, ...
initialLocation, param.initialEstimateError, ...
isTrackInitialized = true;
%Correct state and state estimation error covariance using tracking filter
%使⽤卡尔曼滤波器矫正状态和状态估计协⽅差
trackedLocation = correct(kalmanFilter, detectedLocation);
label = 'Initial';
else
trackedLocation = [];
label = '';
end
else %如果已经初始化
% Use the Kalman filter to track the ball.
if isObjectDetected % The ball was detected.如果检测到⽬标
% Reduce the measurement noise by calling predict followed by
% correct.
%使⽤predict更新跟踪滤波器的状态估计和状态估计误差协⽅差
%应该是更新xt_以及P_,不返回任何值
predict(kalmanFilter);
%使⽤更新过的滤波器和观测位置,预测实际位置
trackedLocation = correct(kalmanFilter, detectedLocation);
label = 'Corrected';
else % The ball was missing.
% Predict the ball's location.
%由于没有观测到的实际位置,因此以状态估计作为预测值返回
trackedLocation = predict(kalmanFilter);
label = 'Predicted';
end
end
annotateTrackedObject();
end % while
showTrajectory();
卡尔曼滤波器在处理过程中分为两个部分:
1. 如果能检测到⼩球,卡尔曼滤波器⾸先预测其位置(应该是先验状态估计),然后根据检测到的位置去对⼩球的实际位置进⾏修正
(后验估计),得到⼀个理想的位置;
2. 如果检测不到⼩球,卡尔曼滤波器只依据前⼀时刻⼩球的位置对当前⼩球的位置进⾏预测。
通过对所有视频帧进⾏叠加可以得到⼩球的轨迹,如下图:
trackSingleObject 函数需要⼀个传⼊参数para,因此实际需要先调⽤getDefaultParameters函数得到para,再传
给trackSingleObject 函数。我这⾥新建了⼀个kalmanFilterForTracking函数实现这个功能。
function kalmanFilterForTracking
trackSingleObject(getDefaultParameters)
end
2.4 卡尔曼滤波器参数配置
卡尔曼滤波器的参数设置需要对卡尔曼滤波的基本原理有⽐较深⼊的理解,主要是⼏个矩阵的设置,对于MATLAB的configureKalmanFilter,其可以选择运动类型(MotionModel),如果运动类型没有设置对,也会出错。
configureKalmanFilter函数需要5个输⼊参数,然后返回⼀个卡尔曼滤波器,如下:
kalmanFilter = configureKalmanFilter(MotionModel, InitialLocation,
InitialEstimateError, MotionNoise, MeasurementNoise)
运动模型必须与物体实际的运动特性相对应,可以设置为匀速或者匀加速运动。下⾯将运动模型设置
为匀速,得到⼀个次优模型。
param = getDefaultParameters(); % get parameters that work well
% to ConstantVelocity
% After switching motion models, drop noise specification entries
% corresponding to acceleration.
param.initialEstimateError = param.initialEstimateError(1:2);
trackSingleObject(param); % visualize the results
该模型的结果如下图:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论