我是卡尔曼滤波的新手,但是用MATLAB可以应用卡尔曼滤波来预测和跟踪视频帧中的目标吗?
进一步的信息:我有一组连续的20张子弹从枪里射出来的图像(一张照片的爆发)。我在画面上做了一些图像处理,现在我可以把子弹作为一个点。我能预测子弹在第21帧中的位置吗?
注:我已经知道了,我需要循环图像帧,并制作一个视频,然后把它用于卡尔曼滤波预测。但是,在不把帧变成视频的情况下,做预测是可能的吗?
谢谢。
发布于 2014-07-06 06:09:04
如果你已经应用卡尔曼滤波开始的20帧,那么你将理解以下的答案。
如果你没有21帧的话。
然后是X(t+1) = A*X(t)+B(u)+Noise
这是“预测”语句,您可以在第21帧预测值。A=状态,atrix,B=控制矩阵。X(t) =子弹在卡尔曼滤波器分配的第20帧中的位置。
如果您没有第21帧,那么您可以使用上面的值来显示21帧中的项目。这是卡尔曼滤波的主要特点之一,即使你没有观测值,也可以预测下一帧的值,这是一个很常见的实际情况,因为大多数时候传感器不选择物体,也没有观测值。
如果你得到了第21帧,然后取观察值并更新你的预测。
我建议查看youtube上的学生戴夫教程,看看卡尔曼滤波和跟踪。然后转到udacity 链接上的Udacity课程。
对于您的问题,kalman滤波函数应该是
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位置,您已经找到了。
发布于 2014-07-05 17:57:18
“计算机视觉系统Tooblox”实现了卡尔曼滤波器:vision.KalmanFilter
文档中有一个演示,显示了这一点的实际操作:
基于卡尔曼滤波的目标跟踪
请注意,框架来自何处并不重要(可以是图像序列,也可以是实际视频)。
发布于 2014-07-06 10:47:02
预测这个位置并不难。您平均位置的变化随着时间的推移,并使用它来预测新的立场。
例如,假设你的子弹处于50,46,41,37的位置,在随后的帧中,有一个已知的(和恒定的)帧速率。位置差异是-4,-5,-4。用你喜欢的平均标准。(卡尔曼滤波采用指数平均)平均速度为-4.33。
因此,下一帧的预测位置为37 + (-4.33) = 32.67像素。
据我所见,你不需要卡尔曼滤波器。如果你只观察位置的话。预测和更新,你不需要它。当你有多个传感器来测量相关的事物,或者一个复杂的系统行为时,卡尔曼滤波器就会发光。(在高速成像中,你通常可以忽略重力。因为你所有的运动都是线性的,所以你有一个简单的系统。)
要回答这个问题:是的,你可以用卡尔曼滤波器来追踪子弹.然而,对于这样一个简单的用例来说,这似乎是过火了。
https://stackoverflow.com/questions/24588756
复制相似问题