用卡尔曼滤波器跟踪目标(用卡尔曼滤波器跟踪目标)

本文讲解如何使用MATLAB中的vision.KalmanFilter对象和configureKalmanFilter函数来跟踪目标。

function kalmanFilterForTracking

背景

卡尔曼滤波器有许多用途,包括控制,导航,计算机视觉和时间序列计量经济学中的应用。此示例说明如何使用卡尔曼滤波器跟踪对象,并重点关注三个重要特征:

· 预测对象的未来位置

· 减少由不准确的检测引入的噪音

· 促进多个对象与其轨道相关联的过程

对象跟踪的挑战

在展示卡尔曼滤波器的使用之前,让我们首先研究跟踪视频中对象的挑战。以下视频显示了一个绿球在地板上从左向右移动。

用卡尔曼滤波器跟踪目标(用卡尔曼滤波器跟踪目标)(1)

showDetections();

球上高亮的白色像素是由 vision.ForegroundDetector检测得到的,这个函数可以从背景中分离移动的目标,背景减法因为球和地板的低对比度使得只能检测到球的一部分,不理想并且引入噪声。

把所有帧叠加到单幅图片上,可视化检测到的轨迹如下。

showTrajectory();

用卡尔曼滤波器跟踪目标(用卡尔曼滤波器跟踪目标)(2)

可以观察到两个问题:

1. 该地区的中心通常与球的中心不同。换句话说,球的位置测量存在误差。

2. 当盒子遮挡球时,球的位置不可用,即测量缺失。

通过使用卡尔曼滤波器可以解决这两个挑战。

使用卡尔曼滤波器跟踪单个对象

使用之前看到的视频,该trackSingleObject功能向您展示:

  • 使用vision.KalmanFilter创建configureKalmanFilter
  • 按顺序使用predict和correct方法以消除跟踪系统中存在的噪声
  • predict当盒子被遮挡时,使用方法自己估计球的位置

卡尔曼滤波器参数的选择可能具有挑战性。该configureKalmanFilter功能有助于简化此问题。细节性的问题可以看最后的函数内容。

该trackSingleObject函数包括嵌套的辅助函数。下面的全局变量用于在子函数之间传输数据。

frame = []; % 视频帧 detectedLocation = []; % 检测到的位置 trackedLocation = []; % 跟踪到的位置 label = ''; % 球的标签 utilities = []; % 处理视频的实例

跟踪单个对象的过程如下所示。

function trackSingleObject(param) % 创建用于读取视频,检测移动对象和显示结果的实用程序。 utilities = createUtilities(param); isTrackInitialized = false; while ~isDone(utilities.videoReader) frame = readFrame(); % 检测球 [detectedLocation, isObjectDetected] = detectObject(frame); if ~isTrackInitialized if isObjectDetected % 当球第一次被检测到时,通过创建一个卡尔曼滤波器初始化一个跟踪器。 initialLocation = computeInitialLocation(param, detectedLocation); kalmanFilter = configureKalmanFilter(param.motionModel, ... initialLocation, param.initialEstimateError, ... param.motionNoise, param.measurementNoise); isTrackInitialized = true; trackedLocation = correct(kalmanFilter, detectedLocation); label = 'Initial'; else trackedLocation = []; label = ''; end else % 使用卡尔曼滤波器来跟踪球 if isObjectDetected % 球被检测到 % 减少测量噪声通过调用卡尔曼预测和更新 predict(kalmanFilter); trackedLocation = correct(kalmanFilter, detectedLocation); label = 'Corrected'; else % 球丢失了 % 预测球的位置 trackedLocation = predict(kalmanFilter); label = 'Predicted'; end end annotateTrackedObject(); end % while结束 showTrajectory(); end

卡尔曼滤波器在解决过程中,分为两种场景:

  1. 当球被检测到时,卡尔曼滤波器首先预测它在当前帧的状态,然后使用最新检测到的目标位置来更新状态。这会产生一个过滤的位置。
  2. 当球看不见时,卡尔曼完全依赖先前的状态预测当前位置。

你可以通过覆盖所有帧来得到球的轨迹。

param = getDefaultParameters(); %得到卡尔曼配置 trackSingleObject(PARAM); %可视化结果

用卡尔曼滤波器跟踪目标(用卡尔曼滤波器跟踪目标)(3)

探索卡尔曼滤波器配置选项

配置卡尔曼滤波器非常具有挑战性。除了对卡尔曼滤波器的基本理解之外,它通常需要实验以便提出一组合适的配置参数。trackSingleObject上面定义的函数可帮助您探索configureKalmanFilter函数提供的各种配置选项。

该configureKalmanFilter函数返回卡尔曼滤波器对象。必须提供五个输入参数。

kalmanFilter = configureKalmanFilter(MotionModel,InitialLocation, InitialEstimateError,MotionNoise,MeasurementNoise)

  • 所述MotionModel设置必须对应于该对象的运动的物理特性。可以将其设置为恒定速度或恒定加速度模型。

用卡尔曼滤波器跟踪目标(用卡尔曼滤波器跟踪目标)(4)

请注意,球出现在与预测位置完全不同的位置。从球被释放的时间起,由于来自地毯的阻力,它经受恒定的减速。因此,恒定加速模型是更好的选择。如果保持恒定速度模型,无论您为其他值选择什么,跟踪结果都将是次优的。

  • 通常,你可以将InitialLocation输入设置为首次检测到对象的位置。你还可以将InitialEstimateError向量设置为较大的值,因为初始状态可能非常嘈杂,因为它是从单个检测派生的。下图演示了错误配置这些参数的影响。

用卡尔曼滤波器跟踪目标(用卡尔曼滤波器跟踪目标)(5)

  • 应根据探测器的精度选择MeasurementNoise的值。 测量噪声设置为较大的值会获得不太精确的检测器。 以下示例说明了错误配置的分段阈值的噪声检测。 增加测量噪声会导致卡尔曼滤波器更多地依赖于其内部状态而不是输入的测量值,从而补偿检测噪声。

用卡尔曼滤波器跟踪目标(用卡尔曼滤波器跟踪目标)(6)

通常,物体不会以恒定的加速度或恒定的速度移动。你可以使用MotionNoise指定与理想运动模型的偏差量。当你增加运动噪声时,卡尔曼滤波器更多地依赖于输入测量而不是内部状态。尝试使用MotionNoise参数进行试验,以了解有关其效果的更多信息。

现在你已熟悉如何使用卡尔曼滤波器以及如何配置它,下一节将帮助您了解如何将其用于多个对象跟踪。

使用卡尔曼滤波器跟踪多个对象

跟踪多个对象会带来一些额外的挑战

  • 必须将多个检测与正确的轨道相关联
  • 必须处理场景中出现的新对象
  • 当多个对象合并为单个检测时,必须保持对象标识

该vision.KalmanFilter对象与assignDetectionsToTracks功能一起可以帮助解决问题

  • 将检测分配给轨道
  • 确定检测是否对应于新对象,换句话说,跟踪创建
  • 就像被遮挡的单个对象的情况一样,预测可以用于帮助分离彼此接近的对象

用卡尔曼滤波器跟踪目标(用卡尔曼滤波器跟踪目标)(7)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页