clear
N=200;%取200個數
w(1)=0;
w=randn(1,N);%產生一個1×N的行向量,第一個數為0,w為過程噪聲(其和后邊的v在卡爾曼理論里均為高斯白噪聲)
x(1)=0;%狀態(tài)x初始值
a=1;%a為狀態(tài)轉移陣,此程序簡單起見取1
for k=2:N
x(k)=a*x(k-1)+w(k-1); %系統狀態(tài)方程,k時刻的狀態(tài)等于k-1時刻狀態(tài)乘以狀態(tài)轉移陣加噪聲(此處忽略了系統的控制量)
end
V=randn(1,N);%測量噪聲
q1=std(V);
Rvv=q1.^2;
q2=std(x);
Rxx=q2.^2; %此方程未用到Rxx
q3=std(w);
Rww=q3.^2; %Rvv、Rww分別為過程噪聲和測量噪聲的協方差(此方程只取一組數方差與協方差相同)
c=0.2;
Y=c*x+V;%量測方差,c為量測矩陣,同a簡化取為一個數
p(1)=0;%初始最優(yōu)化估計協方差
s(1)=0;%s(1)表示為初始最優(yōu)化估計
for t=2:N
p1(t)=a.^2*p(t-1)+Rww;%p1為一步估計的協方差,此式從t-1時刻最優(yōu)化估計s的協方差得到t-1時刻到t時刻一步估計的協方差
b(t)=c*p1(t)/(c.^2*p1(t)+Rvv);%b為卡爾曼增益,其意義表示為狀態(tài)誤差的協方差與量測誤差的協方差之比(個人見解)
s(t)=a*s(t-1)+b(t)*(Y(t)-a*c*s(t-1));%Y(t)-a*c*s(t-1)稱之為新息,是觀測值與一步估計得到的觀測值之差,此式由上一時刻狀態(tài)的最優(yōu)化估計s(t-1)得到當前時刻的最優(yōu)化估計s(t)
p(t)=p1(t)-c*b(t)*p1(t);%此式由一步估計的協方差得到此時刻最優(yōu)化估計的協方差
end
t=1:N;
plot(t,s,'r',t,Y,'g',t,x,'b');%作圖,紅色為卡爾曼濾波,綠色為量測,藍色為狀態(tài)
%整體來說,此卡爾曼程序就是一個循環(huán)迭代的過程,給出初始的狀態(tài)x和協方差p,得到下一時刻的x和p,循環(huán)帶入可得到一系列的最優(yōu)的狀態(tài)估計值,此方法通常用于目標跟蹤和定位。
%本人研究方向與此有關,有興趣可以交流下
在cnki上下篇kalman目標跟蹤的碩士論文吧,很多的,當然期刊也可以,不過一般情況下碩士論文講的能詳細點,然后找準一篇仔細研讀,這樣子基本上理論就沒啥問題了,編程就用MATLAB,用C很麻煩,很多算法都沒有得自己從頭編,matlab集成了很多的算法的,只要找出來調用就行了。
這里給你說下kalman跟蹤的思路吧:
0.如果你的視頻是實際錄得話,為防止檢測到偽目標,首先要對輸入的圖像進行濾波,簡單的有中值均值濾波。
1.對視頻序列采用背景差分或幀間差分就可以得到運動區(qū)域了,這里重點就是背景建模,如果嫌麻煩也就別看什么單高斯或多高斯的了,直接找一個空幀(沒有運動目標)當背景就OK了,差分后就有了運動區(qū)域,然后二值化方便以后的處理。然后視有沒有陰影而進行陰影去除的工作。
2.上邊這步也就是檢測出了運動區(qū)域,按你的檢測出來是要給邊邊畫圈,這個在matlab上好好研究研究怎樣提取目標邊緣的點,在原位圖圖上把邊緣的點改變成一個同像素值就行了,這樣檢測就完了。
3.跟蹤,首先得找到目標的中心,因為目標不只是一個像素,必須有一個中心來表示它的坐標位置,這個方法自己想啦,什么取均值求外接矩形中心啊都可以的,然后每一幀都這么做就有一系列的中心坐標了。
4.Kalman,Kalman的作用還是以濾波為主,相當于把第三步的那些坐標都當成信號序列,用Kalman濾波,邊檢測邊濾波,kalman主要記住那5個公式,知道它的遞推過程就基本能編出來了,至于濾波器參數就在參考文獻里找吧,編出來kalman部分的程序沒多少行的,別怕。
5.如果是多目標跟蹤的話就進行目標匹配的工作,相當于每幀都檢測出兩個目標,你要知道最新一幀中的每個分別對應的是前邊幀的哪個目標。
上邊這些給你一個大體的思路,你根據自己的任務選擇做哪些工作,這個題目不難的,要有信心。
|