N=200%取200个数
w(1)=0
w=randn(1,N)%产生一个1×N的行向量,第一个数为0,w为过程噪声(其和后边的v在卡尔曼理论里均为高斯白噪声)
x(1)=0%状态x初始值
a=1%a为状态转移阵,此程序简单起见取1
for k=2:N
x(k)=a*x(k-1)+w(k-1) %系统状态方程,k时迅颤皮刻的状态等于k-1时刻状态乘以状态转移阵加噪声(此处忽略了系统的控制量)
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%初始最优化估计协方差
s(1)=0%s(1)表示为初始最优化估计
for t=2:N
p1(t)=a.^2*p(t-1)+Rww%p1为一步估计的协方差,此式从t-1时刻最优化估计s的协方差得到t-1时刻到t时刻一步估计的协方差
b(t)=c*p1(t)/(c.^2*p1(t)+Rvv)%b为卡尔曼增益,其意义表示为状态误差的协方差与量测误差的协方差之比(个人见解)
s(t)=a*s(t-1)+b(t)*(Y(t)-a*c*s(t-1))%Y(t)-a*c*s(t-1)称之为新息,是观测值与一步估计得到的观测值之差,此式由上一时刻状态的最优化估计s(t-1)得到当前时刻的最优化估计s(t)
p(t)=p1(t)-c*b(t)*p1(t)%此式由一步估计的协方差得到此时刻最优化估计的协方差
end
t=1:N
plot(t,s,'r',t,Y,'g',t,x,'b')%作图,红色为卡尔曼滤波,绿色为量测,蓝色为状态
%整体来说,此卡尔曼程序就是一个循环迭代的过程,给出初始的状态x和协方差p,得到下一时刻的x和p,循环带入可得到一系列的最优的状态估计值,此方法通常用于目标跟踪和定位。
%本人研究方向与此有关,有兴趣可以交流下。
在cnki上下篇kalman目标跟踪的硕士论文
吧,很多的,当然期刊也可以,不过一般情况下硕士论文讲的能详扮旦瞎细点,然后找准一篇仔细研读,这样子基本上理论就没啥问题了,编程就用MATLAB,用C很麻烦,很多
算法
都没有得自己从头编,matlab集成了很多的算法的,只要找出来调用就行了。
这里给你
说下
kalman跟踪的思路吧:
0.如果你的视频是
实际
录得话,为防止检测到伪目标,首先要对输入的
图像
进行滤波,简单的有中值均值滤波。
1.对视频
序列
采用
背景差分
或帧间
差分
就可以得到运动
区域
了,这里重点就是背景建模,如果嫌麻烦也就别看什么单
高斯
或多高斯的了,直接找一个空帧(没有运动目标)当背景就OK了,差分后就有了运动区域,然后
二值化
方便以后的处理。然后视有没有阴影而进行阴影去除的工作。
2.上边这步也就是检测出了运动区域,按你的检测出来是要给边边
画圈
,这个在matlab上好好研究研究怎样提取目标边缘的点,在
原位
图图上把边迟迹缘的点改变成一个同
像素
值就行了,这样检测就完了。
3.跟踪,首先得找到目标的中心,因为目标不只是一个像素,必须有
一个中心
来表示它的坐标位置,这个方法自厅空己想啦,什么取均值求外接矩形中心啊都可以的,然后每一帧都这么做就有一系列的中心坐标了。
4.Kalman,Kalman的作用还是以滤波为主,相当于把第三步的那些坐标都当成
信号序列
,用Kalman滤波,边检测边滤波,kalman主要记住那5个
公式
,知道它的递推
过程
就基本能编出来了,至于
滤波器
参数
就在参考文献里找吧,编出来kalman部分的
程序
没多少行的,别怕。
5.如果是多目标跟踪的话就进行目标匹配的工作,相当于每帧都检测出两个目标,你要知道最新一帧中的每个分别对应的是前边帧的哪个目标。
上边这些给你一个大体的思路,你根据自己的任务选择做哪些工作,这个题目不难的,要
有信心
状态预测(位置、速度等)的准不准,影响了目标之间能否正确匹配(目标编号)。
上图是多目标跟踪的一戚老个例子,有效跟踪范围为x=0到x=200之间, 红线 表示卡尔曼滤波的 初始化 及 更新 阶段, 绿线 表示 预测 阶段。
当t=1时,
当t=2时,
当t=3时,
当t=4时,
当t=5时,
当t=6时,
由上述分析可高笑升知,卡尔曼滤波算法对多目标的状态进行估计,匈牙利算法对多目标进行匹配,实现多升清目标跟踪。
参考 https://www.pianshen.com/article/9795849360/
公式中 A和H为转移矩阵
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)