卡尔曼滤波器跟踪和视频帧预测

时间:2014-07-05 17:09:20

标签: matlab image-processing prediction matlab-cvst kalman-filter

我是卡尔曼滤波的新手,但是有可能使用卡尔曼滤波器来预测和跟踪视频帧中的对象吗?

进一步的信息:我有一套连续的20张枪弹图像(一张图像的爆发照片)。我对帧进行了一些图像处理,现在我可以将子弹指示为一个点。 我可以预测第21帧中子弹的位置吗?

注意:我必须知道,我需要循环图像帧并制作视频,然后将其用于卡尔曼滤波器预测。但是有可能在不将帧变成视频的情况下进行预测。

谢谢。

3 个答案:

答案 0 :(得分:2)

如果您已经为起始20帧应用了卡尔曼滤波器,那么您将理解以下答案。

如果你没有第21帧。

然后X(t+1) = A*X(t)+B(u)+Noise

这是预测声明,您可以预测第21帧的值。 A =状态,atrix,B =控制矩阵。 X(t)=由卡尔曼滤波器分配的第20帧中子弹的位置。

如果你没有第21帧,那么你可以使用上面的值来显示第21帧中的子弹。这是卡尔曼滤波器的主要特征之一,即使你没有观测值,你仍然可以预测下一帧的值。这是一个非常常见的实际案例,因为大多数时候传感器不要挑选物品,也没有观察价值。

如果你得到第21帧,那么拿下观察值并更新你的预测。

我建议你在youtube上查看学生dave教程,了解卡尔曼过滤和跟踪。 并转到Udacity link的udacity课程。

你的问题的卡尔曼滤波函数想要

    void Kalman_Filter(float *Zx, float *Zy)
{

    Mat Zt = (Mat_<float>(2, 1) << *Zx, *Zy);

    //prediction
    Predict = A*Prior;// +B*a;

    //covariacne
    P = P*P*A.t() + Ex;

    //measurement uopdate
    Mat Kt = P*H.t()*(H*P*H.t() + Ez);
    //
    Prior = Predict + Kt*(Zt - H*Predict);
    //
    P = (I - Kt*H)*P;
    //
    *Zx = Prior.at<float>(0, 0);
    *Zy = Prior.at<float>(1, 0);
    //
    return;

}

这里* Zx和* Zy是观察值,包含你发现的点大小子弹的x和y位置。

答案 1 :(得分:1)

计算机视觉系统Tooblox&#34;实施Kalman filtersvision.KalmanFilter

文档中有一个演示,其中显示了这一点:

  

Using Kalman Filter for Object Tracking

请注意,帧的来源并不重要(可能是图像序列或实际视频)。

答案 2 :(得分:0)

预测位置并不是很难。您可以平均随时间变化的位置,并使用它来预测新的位置。

例如,假设您的子弹在具有已知(和常量)帧速率的后续帧中位于第50,46,41,37位。位置差异为-4,-5,-4。 使用你喜欢的平均值。 (卡尔曼滤波器使用指数平均)平均速度为-4.33

下一帧中的预测位置因此是37 +( - 4.33)= 32.67像素

从我看来,你不需要卡尔曼滤波器。如果你只观察位置。预测和更新,你不需要它。当你有多个测量相关事物的传感器或复杂的系统行为时,卡尔曼滤波器真的很棒。 (在高速成像中,您通常可以忽略重力。由于您的所有运动都是线性的,因此您拥有一个简单的系统。)

回答这个问题:是的,您可以使用卡尔曼滤波器跟踪子弹。然而,对于这样一个简单的用例,它似乎有点矫枉过正。