我是卡尔曼滤波的新手,但是有可能使用卡尔曼滤波器来预测和跟踪视频帧中的对象吗?
进一步的信息:我有一套连续的20张枪弹图像(一张图像的爆发照片)。我对帧进行了一些图像处理,现在我可以将子弹指示为一个点。 我可以预测第21帧中子弹的位置吗?
注意:我必须知道,我需要循环图像帧并制作视频,然后将其用于卡尔曼滤波器预测。但是有可能在不将帧变成视频的情况下进行预测。
谢谢。
答案 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 filters:vision.KalmanFilter
文档中有一个演示,其中显示了这一点:
请注意,帧的来源并不重要(可能是图像序列或实际视频)。
答案 2 :(得分:0)
预测位置并不是很难。您可以平均随时间变化的位置,并使用它来预测新的位置。
例如,假设您的子弹在具有已知(和常量)帧速率的后续帧中位于第50,46,41,37位。位置差异为-4,-5,-4。 使用你喜欢的平均值。 (卡尔曼滤波器使用指数平均)平均速度为-4.33
下一帧中的预测位置因此是37 +( - 4.33)= 32.67像素
从我看来,你不需要卡尔曼滤波器。如果你只观察位置。预测和更新,你不需要它。当你有多个测量相关事物的传感器或复杂的系统行为时,卡尔曼滤波器真的很棒。 (在高速成像中,您通常可以忽略重力。由于您的所有运动都是线性的,因此您拥有一个简单的系统。)
回答这个问题:是的,您可以使用卡尔曼滤波器跟踪子弹。然而,对于这样一个简单的用例,它似乎有点矫枉过正。