1、目 录 一、 kalman 滤波简介 2二、 kalman 滤波基本原理 2三、 Kalman 滤波在运动跟踪中的应用的建模 .4四、 仿真结果 .71、kalman 的滤波效果 72、简单轨迹的 kalman的预测效果 83、椭圆运动轨迹的预测 .104、往返运动归轨迹的预测 .11五、 参数的选取 .12附录: .14Matlab 程序: .14C 语言程序: 14Kalman 滤波在运动跟踪中的应用1Kalman滤波在运动跟踪中的应用一、 kalman 滤波简介最佳线性滤波理论起源于 40年代美国科学家 Wiener和前苏联科学家 等人的研究工作,后人统称为维纳滤波理论。从理论上说,维纳
2、滤波的最大缺点是必须用到无限过去的数据,不适用于实时处理。为了克服这一缺点,60 年代 Kalman把状态空间模型引入滤波理论,并导出了一套递推估计算法,后人称之为卡尔曼滤波理论。卡尔曼滤波是以最小均方误差为估计的最佳准则,来寻求一套递推估计的算法,其基本思想是:采用信号与噪声的状态空间模型,利用前一时刻地估计值和现时刻的观测值来更新对状态变量的估计,求出现时刻的估计值。它适合于实时处理和计算机运算。Kalman滤波是卡尔曼(R.E.kalman)于 1960年提出的从与被提取信号的有关的观测量中通过算法估计出所需信号的一种滤波算法。他把状态空间的概念引入到随机估计理论中,把信号过程视为白噪声
3、作用下的个线性系统的输出,用状方程来描述这种输入输出关系,估计过程中利用系统状态方程、观测方程和白噪声激励(系统噪声和观测噪声)的统计特性形成滤波算法,由于所用的信息都是时域内的量,所以不但可以对平稳的一维随机过程进估计,也可以对非平稳的、多维随机过程进行估汁。Kalman滤波是一套由计算机实现的实时递推算法它所处理的对象是随机信号,利用系统噪声和观测噪声的统计特性,以系统的观测量作为滤波器的输入,以所要估计值(系统的状态或参数)作为滤波器的输出,滤波器的输入与输出之间是由时间更新和观测更新算法联系在一起的,根据系统方程和观测方程估计出所有需要处理的信号。所以,Kalman 滤波与常规滤波的涵
4、义与方法不同,它实质上是一种最优估计法。卡尔曼滤波器是一个“optimal recursive data processing algorithm(最优化自回归数据处理算法) ,对于解决很大部分的问题,他是最优,效率最高甚至是最有用的二、 kalman 滤波基本原理Kalman滤波器是目标状态估计算法解决状态最优估计的一种常用方法具有计算量小、存储量低、实时性高的优点。实际应用中,可以将物理系统的运行过程看作是一个状态转换过程,卡尔曼滤波将状态空间理论引入到对物理系统的数学建模过程中来。其基本思想是给系统信号和噪声的状态空间建立方程和观测方程,只用信号的前一个估计值和最近一个观察值就可以在线性
5、无偏最小方差估计准则下对信号的当前值做出最优估计。设一系统所建立的模型为:Kalman 滤波在运动跟踪中的应用2状态方程:个离散控制过程的系统,X(k)=A X(k-1)+B U(k)+W(k) 观测方程:系统的测量值Z(k)=H X(k)+V(k)上两式子中,X(k)是 k时刻的系统状态,U(k)是 k时刻对系统的控制量。A和 B是系统参数,对于多模型系统,他们为矩阵。Z(k)是 k时刻的测量值,H是测量系统的参数,对于多测量系统,H 为矩阵。W(k)和 V(k)分别表示过程和测量的噪声。他们被假设成高斯白噪声(White Gaussian Noise),他们的covariance 分别是
6、Q,R(这里我们假设他们不随系统状态变化而变化) 。对于满足上面的条件(线性随机微分系统,过程和测量都是高斯白噪声),卡尔曼滤波器是最优的信息处理器。下面我们来用他们结合他们的covariances 来估算系统的最优化输出(类似上一节那个温度的例子) 。首先我们要利用系统的过程模型,来预测下一状态的系统。假设现在的系统状态是 k,根据系统的模型,可以基于系统的上一状态而预测出现在状态:X(k|k-1)=A X(k-1|k-1)+B U(k) (1)式(1)中,X(k|k-1)是利用上一状态预测的结果,X(k-1|k-1)是上一状态最优的结果,U(k)为现在状态的控制量,如果没有控制量,它可以为
7、 0。到现在为止,我们的系统结果已经更新了,可是,对应于 X(k|k-1)的covariance还没更新。我们用 P表示 covariance:P(k|k-1)=A P(k-1|k-1) A+Q (2)式(2)中,P(k|k-1)是 X(k|k-1)对应的 covariance,P(k-1|k-1)是 X(k-1|k-1)对应的 covariance,A表示 A 的转置矩阵,Q 是系统过程的covariance。式子 1,2 就是卡尔曼滤波器 5个公式当中的前两个,也就是对系统的预测。现在我们有了现在状态的预测结果,然后我们再收集现在状态的测量值。结合预测值和测量值,我们可以得到现在状态(k)
8、的最优化估算值 X(k|k):X(k|k)= X(k|k-1)+Kg(k)(Z(k)-H X(k|k-1) (3)其中 Kg为卡尔曼增益(Kalman Gain):Kg(k)= P(k|k-1) H/(H P(k|k-1) H + R) (4)到现在为止,我们已经得到了 k状态下最优的估算值 X(k|k)。但是为了要使卡尔曼滤波器不断的运行下去直到系统过程结束,我们还要更新 k状态下X(k|k)的 covariance:P(k|k)=(I-Kg(k)H)P(k|k-1) (5)其中 I为 1的矩阵,对于单模型单测量,I=1。当系统进入 k+1状态时,P(k|k)就是式子(2)的 P(k-1|k
9、-1)。这样,算法就可以自回归的运算下去。Kalman 滤波在运动跟踪中的应用3总结以上内容克制,Kalman 滤波器实现的主要五个方程为:(1)状态向量预报方程 1kkXA(2)状态向量协方差预报方程 11 kTkkQP(3)Kalman加权矩阵(或增益矩阵) 1)( kTkTkRHK(4)状态向量更新方程 )(kkkXZX(5)状态向量协方差更新方程 )(kkPHKIPKalman滤波预估计就是用前面两个时间更新方程获得先验估计然后通过后面三个状态更新方程对先验估计矫正获得最优估计。根据这 5个公式,可以很容易的实现计算机的程序。卡尔曼滤波的算法流程为:1. 预估计 X(k)= F(k,k
10、-1)X(k-1) 2. 计算预估计协方差矩阵C(k)=F(k,k-1)C(k)F(k,k-1)+T(k,k-1)Q(k)T(k,k-1)Q(k) = U(k)U(k) 3. 计算卡尔曼增益矩阵 K(k) = C(k)H(k)H(k)C(k)H(k)+R(k)(-1)R(k) = N(k)N(k) 4. 更新估计 X(k)=X(k)+K(k)Y(k)-H(k)X(k) 5. 计算更新后估计协防差矩阵C(k) = I-K(k)H(k)C(k)I-K(k)H(k)+K(k)R(k)K(k) 6. X(k+1) = X(k) Kalman 滤波在运动跟踪中的应用4C(k+1) = C(k)重复以上六
11、个步骤。三、 Kalman 滤波在运动跟踪中的应用的建模卡尔曼滤波器是一个对动态系统的状态序列进行线性最小误差估计的算法,一般用于线性系统。一般在运动跟踪领域中摄像机相对于目标物体运动有时属于非线性系统,但由于在一般运动跟踪问题中图像采集时间间隔较短,可近似将单位时间内目标在图像中的运动看作匀速运动,采用卡尔曼滤波器可以实现对目标运动参数的估计。对于复杂背景下运动目标识别与跟踪问题,要实现实时控制,对算法的实时性和准确性都有较高的要求。如果目标识别算法都是基于像素的全局搜索,则存在显著缺点:1)全局搜索计算量大、耗时,实时性无法满足;2)全局搜索抗干扰能力差,容易受到背景中相似特征物体的干扰。
12、基于卡尔曼滤波器预测功能的运动目标快速跟踪算法可以通过预测目标物体在下一帧中的位置,将全局搜索问题转化为局部搜索,缩小搜索范围,提高算法的实时性。在跟踪运动目标的过程中,由于目标物体单位时间内在图像中的运动可以看作匀速运动,所以可以采用目标某一时刻在图像中的位置和速度来表示目标的运动状态。为了简化算法的计算复杂度,可以设计 2个卡尔曼滤波器分别描述目标在 X轴和 Y轴方向上位置和速度的变化。下面仅讨论 X轴方向上卡尔曼滤波器的实现过程,Y 轴方向上同理。目标物体运动方程为:Tavxkk1式中 , , 分别为目标在 t=k时刻的 X轴方向的位置、速度和加速度;T 为 k帧图像和 k+1帧图像之间
13、的时间间隔, Tak可以当作白噪声处理。写成矩阵形式如下:系统状态方程为: Tavxvxkkk 0101卡尔曼滤波器系统状态矢量为: TkkxX状态转移矩阵为:Kalman 滤波在运动跟踪中的应用510)(TkH系统动态噪声矢量为: Tawk系统观测方程为: kkvxx01卡尔曼滤波器系统观测矢量为: kxZ观测系数矩阵为: 01kH由观测方程可知,观测噪声为 0,所以 kR=0。建立了上述系统状态方程和观测方程之后,就可以利用卡尔曼滤波方程式通过递推方法,不断预测目标在下一帧中的位置。在 t=k时刻,对第 k帧图像利用目标识别算法识别出的目标位置记为 kx,当目标首次出现时,根据此时目标的观
14、测位置初始化滤波器 0X= ,0。系统初始状态向量协方差矩阵可以在对角线上取较大值,取值根据实际测量情况来获得,但在滤波启动一段时间后影响就不大了。取: 100P。系统动态噪声协方差为 0Q,可取为:100Q。通过公式(1),计算得到目标在下一帧图像中的预测位置 1X。在该位置附近,对下一帧图像进行局部搜索,识别出的目标质心位置即为 Z,通过公式(2)至公式(5)完成对状态向量和状态向量协方差矩阵的更新,为目标位置的下一步预测做好准备,得出新的预测位置 2X,采用图像处理算法,在该位置进行局部Kalman 滤波在运动跟踪中的应用6搜索,从而得出新的目标质心位置 2Z,一直迭代计算下去,从而实现
15、对目标物体的跟踪。简化计算的到以下的实际编程公式:(1)状态向量预报方程1kkXA简化: Xy=Xb1+ Vb1*T ;Vy=Vb1 ; (2)状态向量协方差预报方程 11 kTkkQAP简化: Py= = * * +Q432y04)1(3)(2bP0TPy1= (Pbb1+ Pbb3*T)+(Pbb2+Pbb4) *T;Py2= Pbb2+Pbb4*T;Py3= Pbb3+Pbb4*T;Py4= Pbb4;(3)Kalman加权矩阵(或增益矩阵) 1)( kTkTkRHPK简化: Kg= g21Kg1=Py1/( Py1+R)Kg2= Py3/( Py1+R)(4)状态向量更新方程 )(kk
16、kXHZKX简化: Xb=Xy+ Kg1(Xnew+ Xy) ;b=Vy+ Kg2(Xnew+ Xy) ; (5)状态向量协方差更新方程 )(kkPIP简化: Pb1=(1- Kg1)* Py1- Kg1 Py3;Pb2=(1- Kg1)* Py2- Kg1 Py4;Pb3=(1- Kg1)* Py3- Kg1 Py1;Pb3=(1- Kg1)* Py4- Kg1 Py2;四、 仿真结果Kalman 滤波在运动跟踪中的应用71、kalman 的滤波效果对一个定值函数 y=25,加高斯白噪声噪声之后,经卡拉曼滤波可得到的检测对比加噪声的之后的信号(测量信号)和经过 kalman滤波后的信号(滤波
17、后的信号) ,对比两个信号。从图 1的滤波结果中可以看出,经过 kalman滤波之后,信号基本上与加高斯白噪声之前的信号一直,误差大大减少,由此可以看出,kalaman 滤波对于白噪声有比较好的滤除作用。图 1 kalaman 滤波滤除信号中的白噪声2、简单轨迹的 kalman的预测效果使用基本的 kalman滤波方法,预测下一个 x的位置。建立模型的方法是:将目标物体在 T时间内的运动可以看作匀速运动,采用目标某一时刻在图像中的位置和速度来表示目标的运动状态。为了简化算法的计算复杂度,使用两个个卡尔曼滤波器分别描述目标在 X轴和 Y轴方向上位置和速度的变化,两个滤波器的原理相同。仿真的结果如
18、下:左边的运动的轨迹,右边的是 kalman的预测的误差。Kalman 滤波在运动跟踪中的应用8Kalman 滤波在运动跟踪中的应用9图 2 简单轨迹的 kalman的预测效果可以看出当物体匀速运动的时候,kalman 的预测比较准确;当物体改变速度的幅度比较大的时候,这是因为速度变化较大的时候,表明加速度的变化比较大,这样用之前的参数预测就会有较大的偏差,所以 kalman的误差会比较明显。3、椭圆运动轨迹的预测下面是物体运动作椭圆运动的一个预测:蓝色为实际轨迹,绿色为预测的轨迹,从 x方向误差看,kalman 的效果比较明显,y 方向的预测效果就一般了,这个主要是跟 kalman的的滤波参
19、数选取有关,kalman 是将运动的加速度看做白噪声处理的,参数的选取与加速度的方差有关。现在用的参数是参考一些论文的设置,然后自己经过测试选取的。速度变化大的时候就会预测不太准确,现在写的 kalman还不能对速度变化自适应。Kalman 滤波在运动跟踪中的应用10图 3 椭圆运动轨迹的预测4、往返运动归轨迹的预测kalman在窗口缩小情况下的跟踪效果,为了效果明显,将运动的轨迹做了调整,在改变速度、改变窗口大小的情况下,做了多组跟踪测试,下面是将其中一组测试速度变化较快、开窗较小的数据,轨迹如下图所示。结果分析:在速度变化比较大,开窗比较小的情况下,用 kalman的丢帧次数会减少一些,
20、(硬件测试观测的结果) ;比较 matlab分析的结果,用 kalman的预测误差(绿线)比原始的帧间误差(蓝线)要小一些,遇到速度变化比较剧烈的时候,误差较大,易造成丢帧。整体来说,经过 kalman处理,预测数据与真实数据之间的误差有所减小,而且在运动不突变的情况下,预测也相对准确,这是 kalman的优势。Kalman 滤波在运动跟踪中的应用11(1) 运动轨迹(2) 局部放大的轨迹(3) X 方向的误差分析(4) Y 方向的误差分析图 4 kalman对往返运动的预测五、 参数的选取建立模型,状态方程 X(k)=A X(k-1)+B U(k)+W(k) 和观测方程 Z(k)=H X(k
21、)+V(k)。式子中,X(k)是 k时刻的系统状态,U(k)是 k时刻对系统的控制量。A和 B是系统参数,对于多模型系统,他们为矩阵。Z(k)是 k时刻的测量值,H是测量系统的参数,对于多测量系统,H 为矩阵。W(k)和 V(k)分别表示过程和Kalman 滤波在运动跟踪中的应用12测量的噪声。他们被假设成高斯白噪声(White Gaussian Noise),他们的covariance 分别是 Q,R(这里我们假设他们不随系统状态变化而变化) 。需要选取的参数主要是一下三个:初始观测位置:当目标首次出现时,根据此时目标的观测位置初始化滤波器 0X=x, 0。初始位置的选取会影响到 kalma
22、n在多少次运算之后才趋向于准确,因为 kalman是迭代收敛来逐渐趋向于真实值的,如果开始的初始化位置与实际的位置相差比较大,就需要多迭代几次,这时需要注意的是前几帧的数据将会有较大的误差。初始状态向量协方差矩阵:系统初始状态向量协方差矩阵可以在对角线上取较大值,取值根据实际测量情况来获得,但在滤波启动一段时间后影响就不大了。因为 kalman会自行迭代产生新的向量协方差矩阵,直至达到最优。取:100P。系统动态噪声协方差矩:系统动态噪声协方差矩阵为 0Q,这个矩阵主要是表征了噪声的特性,也就是加速度的变化特性,这里要根据实际的运动模型来选取,不同的状态下噪声的特性也不同。可以一般来说,可取为
23、: 100Q。也可以根据效果修改的到一个较好的参数。Kalman 滤波在运动跟踪中的应用13附录:Matlab 程序:function X_next= kalman_f(D_y,N,A,T,Q,H,I,R,Pb1,Xb1);for k=1:N-1;Y=D_y(k);%Y=S(k); %测量值 Y 更新输入数据 Y=S(k),V(k); Xy=A*Xb1; %系统的预测值 前一时刻 X 的相关系数?Py=A*Pb1*A+Q; %Py(k)为 X(kk-1)状态的协方差Kg=(Py*H)*inv(H*Py*H+R); %卡尔曼增益 Kg=(Py+H)/(H*Py*H+R); R=0;Xb=Xy+K
24、g*(Y-H*Xy); %系统的最佳估计值 即经过滤波后的信号 Pb=(I-Kg*H)*(Py); %Pb(k)为 X(kk)状态的协方差 即 t 状态下 x(t|t)的相关系数Xb1=Xb; % 更新最佳估计值Pb1=Pb; % 更新误差Sb(k+1)=Xb(1,1);Vb(k+1)=Xb(2,1); x_next=A*Xb1;X_next(k+1)=x_next(1,1);EndC 语言程序:/* 基本的 kalman 滤波,预测下一个 x 的位置;将目标物体在 T 时间内的运动可以看作匀速运动,采用目标某一时刻在图像中的位置和速度来表示目标的运动状态。设计 2 个卡尔曼滤波器分别描述目标
25、在 X 轴和 Y 轴方向上位置和速度的变化,为了简化算法的计算复杂度。下面是讨论 X 轴方向上卡尔曼滤波器的实现过程,y 轴方向上的相同.*/#include #include #include “math.h“/初始化参数#define T 1 /帧与帧间的时间间隔#define R 0 /观测误差矩阵#define Q0 0.002 /系统动态噪声协方差 #define Q1 0#define Q2 0#define Q3 0.002int i;int X_new;float X;Kalman 滤波在运动跟踪中的应用14float X_best,V_best;/预测值float X_y,V
26、_y; /估计值float X_next;int X_next1;float Py4; /协方差预测矩阵float Pb4=10,0,0,10; /状态向量协方差更新方程 /初始化协方差矩阵/ volatile int Pbb4;float Kg2;int kalman_1( int X_new, int V_new, int flag)/flag=0,第一次进入 kalman if(flag=0) /updata the new number /initialization X_best=X_new;/可设置为常数,则 V_new 就不需要传输了V_best=V_new;else/状态向量预
27、报方程X_y=X_best+V_best*T; /iterationV_y=V_best;/协方差预测Py0= (Pb0+ Pb2*T) + (Pb1+Pb3*T)*T + Q0;Py1= Pb1+Pb3*T+Q1;Py2= Pb2+Pb3*T+Q2;Py3= Pb3+Q3;/kalman 增益矩阵Kg0=Py0/(Py0+R);/ Kg0=1;/Kg1= Py2/ (Py0+R );/ Kg1=1;/状态向量更新方程X_best=X_y+Kg0*(X_new-X_y);/forcast the best xV_best=V_y+Kg1*(X_new-X_y);/状态向量协方差更新方程Pb0=
28、(1-Kg0)* Py0-Kg0*Py2; /Pb1=(1- Kg1)* Py1- Kg1 Py3;Pb1=(1-Kg0)* Py1-Kg0*Py3; /Pb2=(1- Kg1)* Py2- Kg1 Py4;Pb2=(1-Kg0)* Py2-Kg0*Py0; /Pb3=(1- Kg1)* Py3- Kg1 Py1;Pb3=(1-Kg0)* Py3-Kg0*Py1; /Pb3=(1- Kg1)* Py4- Kg1 Py2;Kalman 滤波在运动跟踪中的应用15X_next=X_best+V_best*T;X_next =(int)(X_next+0.5); /四舍五入转化为整型数 if(X_next0) /设定边界值,因为预测的值有可能超出边界,需要 /约束一下范围X_next=0;return X_next;