【计算机视觉】基于Kalman滤波器的进行物体的跟踪

预估器

我们希望能够最大限度地使用測量结果来预计移动物体的运动。

所以,多个測量的累积能够让我们检測出不受噪声影响的部分观測轨迹。

一个关键的附加要素即此移动物体运动的模型。

有了这个模型,我们不仅能够知道该移动物体在什么位置,同一时候还能够知道我们观察支持模型的什么參数。

该任务分为两个阶段。在第一阶段,即预測阶段。用从过去得到的信息进一步修正模型以取得人或物体的下一个将对出现的位置。在第二阶段,即校正阶段,我们获得一个測量。然后与基于前一次測量的预測值(即模型)进行调整。完毕两个阶段预计任务的方法能够成为预估器。

关于Kalman滤波的通俗解释

在介绍Kalman滤波器原理之前,先从一个通俗的样例中了解一下该算法的功能和作用,以便更好的理解它。

下面是摘自网上的一段资料。

如果我们要研究的对象是一个房间的温度。依据你的经验推断,这个房间的温度是恒定的,也就是下一分钟的温度等于如今这一分钟的温度(如果我们用一分钟来做时间单位)。

如果你对你的经验不是100%的相信。可能会有上下偏差几度。

我们把这些偏差看成是高斯白噪声(White Gaussian Noise),也就是这些偏差跟前后时间是没有关系的并且符合高斯分布(Gaussian Distribution)。

另外,我们在房间里放一个温度计,可是这个温度计也不准确的,測量值会比实际值偏差。我们也把这些偏差看成是高斯白噪声。

好了。如今对于某一分钟我们有两个有关于该房间的温度值:你依据经验的预測值(系统的预測值)和温度计的值(測量值)。以下我们要用这两个值结合他们各自的噪声来估算出房间的实际温度值。

假如我们要估算k时刻的实际温度值。首先你要依据k-1时刻的温度值,来预測k时刻的温度。由于你相信温度是恒定的,所以你会得到k时刻的温度预測值是跟k-1时刻一样的,如果是23度。同一时候该值的高斯噪声的偏差是5度(5是这样得到的:如果k-1时刻估算出的最优温度值的偏差是3,你对自己预測的不确定度是4度,他们平方相加再开方,就是5)。然后。你从温度计那里得到了k时刻的温度值,如果是25度,同一时候该值的偏差是4度。

由于我们用于估算k时刻的实际温度有两个温度值,各自是23度和25度。到底实际温度是多少呢?相信自己还是相信温度计呢?到底相信谁多一点,我们能够用他们的covariance来推断。由于Kg=5^2/(5^2+4^2)。所以Kg=0.61,我们能够估算出k时刻的实际温度值是:23+0.61(25-23)=24.22度。能够看出。由于温度计的covariance比較小(比較相信温度计),所以估算出的最优温度值偏向温度计的值

如今我们已经得到k时刻的最优温度值了,下一步就是要进入k+1时刻,进行新的最优估算。

到如今为止,好像还没看到什么自回归的东西出现。对了。在进入k+1时刻之前。我们还要算出k时刻那个最优值(24.22度)的偏差。算法例如以下:((1-Kg)5^2)^0.5=3.12。这里的5就是上面的k时刻你预測的那个23度温度值的偏差,得出的3.12就是进入k+1时刻以后k时刻估算出的最优温度值的偏差(相应于上面的3)。

就是这样,卡尔曼滤波器就不断的把covariance递归,从而估算出最优的温度值。

他执行的非常快,并且它仅仅保留了上一时刻的covariance。上面的Kg,就是卡尔曼增益(Kalman Gain)。他能够随不同的时刻而改变他自己的值,是不是非常奇妙!

Kalman滤波器简单介绍

Kalman(卡尔曼)滤波是一种高效率的递归滤波器(自回归滤波器), 它可以从一系列的不全然及包括噪声的測量中。预计动态系统的状态。

Kalman滤波的一个典型实例是从一组有限的。包括噪声的,对物体位置的观察序列(可能有偏差)预測出物体的位置的坐标及速度。

Kalman滤波器的基本思想是,若有一组强而合理(合理的意思是“限制很宽松使得这样的方法对真实世界中出现的相当多的实际问题都实用”)的如果。给出系统的历史測量值,则能够建立最大化这些早前測量值的后验概率的系统状态模型。

另外。无需存储非常长的早前測量历史。我们也能够最大化后验概率,即反复更新系统状态模型,并仅仅为下一次更新保存模型。

应用实例

一个简单的应用是预计物体的位置和速度。简要描写叙述例如以下:如果我们能够获取一个物体的包括噪声的一系列位置观測数据,我们能够获得此物体的精确速度和位置连续更新信息。

比如。对于雷达来说。我们关心的是跟踪目标,而目标的位置,速度,加速度的測量值是时刻含有误差的。卡尔曼滤波器利用目标的动态信息,去掉噪声影响。获取目标此刻好的位置预计(滤波)。将来位置预计(预測),也能够是过去位置预计的(插值或平滑)。

三个重要如果

Kalman滤波器须要三个重要如果:

  • 被建模的系统是线性的
  • 影响測量的噪声属于白噪声
  • 噪声本质上是高斯分布的

第一条如果的意思是k时刻的系统状态能够用某个矩阵与k-1时刻的系统状态的乘积表示。余下两条如果,即如果噪声是高斯分布的白噪声。其含义为噪声与时间不相关,且仅仅用均值和协方差(噪声全然由一阶矩和二阶矩描写叙述)就能够准确地为幅值建模。

给定三条如果,Kalman滤波器是将从不同来源获取的数据或从统一来源不同一时候间获得的数据结合的最好的方法。从我们知道的信息開始。获取新的信息,然后依据对旧信息和新信息的确定程度。用新旧信息带权重的结合对我们知道的信息进行更新。

Kalman滤波器的数学知识

基本动态模型

卡尔曼滤波建立在线性代数和隐马尔可夫模型(hidden Markov model)上。其基本动态系统能够用一个马尔可夫链(Markov Chain)表示,该马尔可夫链建立在一个被高斯噪声(即正态分布的噪声)干扰的线性算子上的。系统的状态能够用一个元素为实数的向量表示。 随着离散时间的每个添加,这个线性算子就会作用在当前状态上,产生一个新的状态,并也会带入一些噪声,同一时候系统的一些已知的控制器的控制信息也会被添加。同一时候,还有一个受噪声干扰的线性算子产生出这些隐含状态的可见输出。

Kalman 滤波能够被看作为类似隐马尔科夫模型,它们的显著不同点在于:隐状态变量的取值空间是一个连续的空间。而离散状态空间则不是;另为,隐马尔科夫模型能够描写叙述下一个状态的一个随意分布,这也与应用于Kalman滤波器中的高斯噪声模型相反。

为了从一系列的噪声观測中。应用Kalman滤波预计观測过程的内部状态。

我们必须把这个过程在Kalman滤波器的框架下建立模型。 这就意味着。对于每一步k 我们要定义:

如果Kalman滤波器的k时刻的真实状态时从k-1时刻眼花而来,

满足X[k] = F[k]x[k-1]+B[k]u[k]+w[k]

  • F[k]是作用在前一状态的状态转移模型(状态转移矩阵)
  • B[k]是作用在控制向量u[k]上的控制输入模型(输入输出矩阵)。u[k]的作用是同意外部控制施加于系统
  • w[k]是过程噪声,如果是均值为0的白噪声,协方差为Q[k],则w[k] ~ N(0,Q[k])

在k时刻,如果真实状态x[k]的观測,

Z[k]满足公式Z[k] = H[k]x[k]+v[k]

  • H[k]是观測模型(观測矩阵),它把真实状态映射到观測空间
  • v[k]是观測噪声。如果它是均值是0。方差是R[k]的高斯白噪声。v[k] ~ N(0,R[k])

模型图:

动态系统模型

Kalman Filter基本动态系统模型如上图所看到的,当中,圆圈代表向量。方块代表矩阵,星号代表高斯噪声。其协方差在右下方标出。

  • 初始状态以及每一时刻的噪声向量{x0, w1, ..., wk, v1 ... vk} 都为觉得是互相独立的。
  • 实际中,真实世界中动态系统并非严格的符合此模型。可是Kalman模型是设计在噪声过程工作的,一个近似的符合已经能够使这个滤波器很实用。

Kalman模型

三种运动

在Kalman滤波器应用中。我们将考虑三种运动。

动态运动

这样的运动时我们期望的前次測量时系统状态的直接结果。

控制运动

这样的运动是我们期望的,因为某种已知的外部因素以某种原因施加于系统。控制运动最普遍的一个样例是。当对我们施加了控制的系统预计其状态时,我们知道我们的控制会使系统产生什么样的执行。

随机运动

即便是最简单的一维情况。假设观測的目标有因任一原因而产生运动的可能性。那么就须要在预測阶段包括这样的随机运动。这样的随机运动影响的是简单地添加状态预计随时间的协方差。

公式

Kalman滤波器是一个递归的预计。即仅仅要获知上一时刻的状态预计和当前状态的观測就能够计算出当前状态的预计,不同于其它的预计技术。Kalman滤波器不须要观測或/和预计的历史记录,Kalman滤波器是一个纯粹的时域滤波器,而不像低通滤波器等频域滤波器那样,须要在频域中设计。然后转换到时域中应用。

Kalman变量

Kalman 滤波包含两个阶段:预測和更新。在预计阶段。滤波器应用上一状态的预计做出对当前状态的预计。

在更新阶段。滤波器利用在当前状态的观測值优化预測阶段的预測值,以获的一个更精确的当前状态的预计。

预測

预測公式

更新

更新公式

基本概念图示

Kalman基本概念

使用OpenCV中Kalman编程的主要步骤

步骤一

Kalman这个类须要初始化变量

转移矩阵,測量矩阵,控制向量(没有的话,就是0),过程噪声协方差矩阵,測量噪声协方差矩阵,后验错误协方差矩阵,前一状态校正后的值,当前观察值。

void KalmanFilter::init(int dynamParams, int measureParams, int controlParams=0, int type=CV_32F)

//Parameters:
//dynamParams – Dimensionality of the state.
//measureParams – Dimensionality of the measurement.
//controlParams – Dimensionality of the control vector.
//type – Type of the created matrices that should be CV_32F or CV_64F.

步骤二

调用kalman这个类的predict方法得到状态的预測值矩阵

预測状态的计算公式例如以下:

predicted state (x‘(k)): x‘(k)=A x(k-1)+B u(k)

当中x(k-1)为前一状态的校正值,第一个循环中在初始化过程中已经给定了,后面的循环中Kalman这个类内部会计算。A,B,u(k),也都是给定了的值。这样进过计算就得到了系统状态的预測值x‘(k)了。

const Mat& KalmanFilter::predict(const Mat& control=Mat())

//Parameters:    control – The optional input control

步骤三:

调用kalman这个类的correct方法得到增加观察值校正后的状态变量值矩阵

其公式为:

corrected state (x(k)): x(k)=x‘(k)+K(k) (z(k)-H x‘(k))

当中x‘(k)为步骤二算出的结果。z(k)为当前測量值,是我们外部測量后输入的向量。

H为Kalman类初始化给定的測量矩阵。K(k)为Kalman增益,其计算公式为:

Kalman gain matrix (K(k)): K(k)=P‘(k) Ht inv(H P‘(k) Ht+R)

计算该增益所依赖的变量要么初始化中给定,要么在kalman理论中通过其他公式能够计算。

const Mat& KalmanFilter::correct(const Mat& measurement)

//Parameters:    measurement – The measured system parameters

经过步骤三后。我们又又一次获得了这一时刻的校正值,后面就不断循环步骤二和步骤三就可以完毕Kalman滤波过程。

參考资料

1、学习OpenCV 中文版

2、学习OpenCV——Kalman滤波

转载请注明作者Jason Ding及其出处

Github主页(http://jasonding1354.github.io/)

CSDN博客(http://blog.csdn.net/jasonding1354)

简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)

时间: 2024-10-30 22:04:10

【计算机视觉】基于Kalman滤波器的进行物体的跟踪的相关文章

Kalman滤波器从原理到实现

转载请注明出处:http://xiahouzuoxin.github.io/notes Kalman滤波器的历史渊源 We are like dwarfs on the shoulders of giants, by whose grace we see farther than they. Our study of the works of the ancients enables us to give fresh life to their finer ideas, and rescue t

运动目标跟踪中kalman滤波器的使用

目标跟踪的kalman滤波器介绍 Kalman滤波器是通过前一状态预测当前状态,并使用当前观测状态进行校正,从而保证输出状态平稳变化,可有效抵抗观测误差.因此在运动目标跟踪中也被广泛使用.在视频处理的运动目标跟踪里,每个目标的状态可表示为(x,y,w,h),x和y表示目标位置,w和h表示目标宽高.一般地认为目标的宽高是不变的,而其运动速度是匀速,那么目标的状态向量就应该扩展为(x,y,w,h,dx,dy),其中dx和dy是目标当前时刻的速度.通过kalman滤波器来估计每个时刻目标状态的大致过程

Kalman滤波器原理和实现

Kalman滤波器原理和实现 kalman filter Kalman滤波器的直观理解[1] 假设我们要测量一个房间下一刻钟的温度.据经验判断,房间内的温度不可能短时大幅度变化,也就是说可以依经验认为下一刻钟的温度等于现在的温度.但是经验是存在误差的,下一刻的真实温度可能比我们预测温度上下偏差几度,这个偏差可以认为服从高斯分布.另外我们也可以使用温度计测量温度,但温度计测量的是局部空间的温度,没办法准确的度量整间房子的平均温度.测量值和真实值得偏差也认为服从高斯分布. 现在希望由经验的预测温度和

终于成功仿了一次Kalman滤波器

终于成功仿了一次Kalman滤波器 首先是测试了从网上down的一段代码 % KALMANF - updates a system state vector estimate based upon an% observation, using a discrete Kalman filter.%% Version 1.0, June 30, 2004%% This tutorial function was written by Michael C. Kleder% (Comments are 

【计算机视觉】一步一步实现人脸或特定物体的跟踪(1)——利用CamShift来跟踪

介绍 这里的方法是根据颜色直方图的方式进行人脸或者特定物体的跟踪的,具体步骤是首先计算指定区域的色彩直方图,然后再根据该色彩直方图对整个图片区域进行反投影计算,得到的是该图片中复合指定区域色彩直方图分布的概率分布,最终通过多次迭代,得到一个输出的目标窗口. 实例代码 下面是OpenCV提供的演示代码 #include "StdAfx.h" #include "opencv2/video/tracking.hpp" #include "opencv2/img

目标跟踪文章翻译--基于主动特征选择的鲁棒目标跟踪

摘要:基于检测的自适应跟踪已经被广泛研究了且前景很好.这些追踪器的关键理念是如何训练一个在线有识别力的分类器,这个分类器可以把一个对象从局部背景中分离出来.利用从检测目标位置附近的当前帧中提取的正样本和负样本不断更新分类器.然而,如果检测不准确,样本可能提取的不太准确,从而导致视觉漂移.最近,基于跟踪的多实例学习(MIL)已经在某些程度上提出了一些解决这些问题的办法.它将样本放入正负包中,然后通过最大化似然函数用在线提升的办法选择一些特征.最后,被选择的特征相结合用于分类.然而,在MIL追踪里,

基于最大一致性上下文的广域车辆跟踪

基于最大一致性上下文的广域车辆跟踪 最大一致性 MTT 广域运动图像 读"X. Shi, P. Li, H. Li, W. Hu, E. Blasch, Using Maximum Consistence Context for Multiple Target Association in Wide Area Traffic Scenes[J], ICASSP, 2013." 笔记. 首先该论文中提出了最大一致性上下文信息,主要用于wide area traffic scene. wi

DIY一个基于树莓派和Python的无人机视觉跟踪系统

DIY一个基于树莓派和Python的无人机视觉跟踪系统 无人机通过图传将航拍到的图像存储并实时传送回地面站几乎已经是标配.如果想来点高级的--在无人机上直接处理拍摄的图像并实现自动控制要怎么实现呢?其实视觉跟踪已经在一些高端的消费级无人机上有了应用,不过玩现成的永远没有自己动手来劲;).前段时间DIY了一个无人机三轴云台的视觉跟踪系统,除去云台花了¥370,本文将设计思路与实验效果分享出来. 一.基本配置 1.1 硬件 计算平台:树莓派3 (¥219.00) 摄像头:USB网络摄像头(¥108.

基于粒子滤波器的目标跟踪算法及实现

代码实现: 运行方式:按P停止,在前景窗口鼠标点击目标,会自动生成外接矩形,再次按P,对该选定目标进行跟踪. [cpp] view plaincopy // TwoLevel.cpp : 定义控制台应用程序的入口点. // /************************************************************************/ /*参考文献real-time Multiple Objects Tracking with Occlusion Handli