如何配置卡尔曼滤波器矩阵来跟踪移动传送带上的物体

时间:2016-04-05 11:30:07

标签: matlab opencv image-processing computer-vision kalman-filter

我正在构建一个视觉传送系统,用于计算与项目工作相似的小型对象。 物体检测很流畅。但我在跟踪部分遇到了问题。

背景

  1. 输送机:单向,恒定速度1.5英尺/秒。
  2. 相机:罗技c920 @ 30FPS,分辨率为800x600px。
  3. 物体追踪:矩形20mm x 10mm
  4. 对象仅在大约8帧的视野中停留
  5. 代码工作流程

    Tracking workflow

    如果我拍摄连续视频@ 30FPS,每个物体(质心)的准确距离为52像素/帧。 在离线模式下(处理保存的视频),我可以通过向每个跟踪对象的next_location添加52像素来预测centroid.x

    但是,当我上线时,由于处理时间的原因,帧速率降至15-20 FPS。 所以对象的next_location从80到200像素/帧不等。 现在我必须动态预测next_location,因此我选择卡尔曼滤波器。

    问题陈述:

    我的问题是将卡尔曼矩阵配置为我的“恒速,单向”系统模型。 (由于振动,y轴的变化非常小,最大为0到5像素。)

      

    物体的速度没有误差,但不规则   帧捕获事件会导致预测错误   next_location。

    我经历了许多教程,如Student DaveKalman filter for dummies等。在每个教程中,我都能清楚地了解卡尔曼滤波器可以做什么,稍微了解它如何通过状态方程进行预测,但矩阵填充部分对我来说似乎非常复杂。

    在某些实现代码中,如ball trackermouse pointer trackermulti-bug tracker,我可以看到所有矩阵都已填充,但我不知道哪个矩阵要更改为哪个元素以适应我的要求。

    MATLAB documentation of Kalman filter明确提供了恒定速度和恒定加速度运动模型的矩阵,this MATLAB code在离线模式下正确地预测了我的对象。

            stateTransitionModel= [1 1 0 0 ; 0 1 0 0 ; 0 0 1 1 ; 0 0 0 1];
            measurementModel = [1 0 0 0 ; 0 0 1 0];
            state=[centroid(1);0;centroid(2);0];
            stateCovariance=[20 0 0 0; 0 5 0 0; 0 0 20 0; 0 0 0 5];
            processNoise= [100 0 0 0; 0 25 0 0; 0 0 100 0; 0 0 0 25];
            measurementNoise= [100 0; 0 100]
    

    但是当我在OpenCV-C ++中使用相同的6个矩阵时,卡尔曼滤波器甚至没有预测单个next_loc。它只是指出了每个质心的先前位置。

      

    如果有人可以解释矩阵的方式,那将会非常有用   和矩阵元素影响系统建模,并通过什么   配置应该用于“恒速,   我提到的单向“输送机设置,错误   是由相机的不同帧速率引起的。

    我所有问题的清单:

    1. 如何在openCV中配置恒速模型的stateTransition和测量矩阵?

    2. 帧速率引起的误差应该建模为过程噪声还是测量噪声?以及如何为它们分配适当的矩阵值?

    3. 我的初始stateCovariance应该是什么?

    4. 很抱歉问了太多问题。我真的试图自己找到答案,但我有限的数学知识无法弥合理论和代码之间的差距。

0 个答案:

没有答案