【计算机视觉】基于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 滤波包含两个阶段:预測和更新。在预计阶段。滤波器应用上一状态的预计做出对当前状态的预计。
在更新阶段。滤波器利用在当前状态的观測值优化预測阶段的预測值,以获的一个更精确的当前状态的预计。
预測

更新

基本概念图示

使用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)
【计算机视觉】基于Kalman滤波器的进行物体的跟踪的更多相关文章
- Kalman滤波器从原理到实现
Kalman滤波器的历史渊源 We are like dwarfs on the shoulders of giants, by whose grace we see farther than the ...
- Kalman滤波器原理和实现
Kalman滤波器原理和实现 kalman filter Kalman滤波器的直观理解[1] 假设我们要测量一个房间下一刻钟的温度.据经验判断,房间内的温度不可能短时大幅度变化,也就是说可以依经验认为 ...
- 运动目标跟踪中kalman滤波器的使用
目标跟踪的kalman滤波器介绍 Kalman滤波器是通过前一状态预测当前状态,并使用当前观测状态进行校正,从而保证输出状态平稳变化,可有效抵抗观测误差.因此在运动目标跟踪中也被广泛使用.在视频处理的 ...
- 终于成功仿了一次Kalman滤波器
终于成功仿了一次Kalman滤波器 首先是测试了从网上down的一段代码 % KALMANF - updates a system state vector estimate based upon a ...
- 基于Linux-3.9.4内核的GDB跟踪系统调用实验
382 + 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 一.实验环境 win10 -> VMware -> Ubuntu1 ...
- DIY一个基于树莓派和Python的无人机视觉跟踪系统
DIY一个基于树莓派和Python的无人机视觉跟踪系统 无人机通过图传将航拍到的图像存储并实时传送回地面站差点儿已经是标配.假设想来点高级的--在无人机上直接处理拍摄的图像并实现自己主动控制要怎么实现 ...
- kalman滤波器公式的推导
卡尔曼滤波的使用范围: 该系统要有如下关系: 计算步骤: PART0:INI PART1:Time update 迭代的目标:从X(K-1)+ 求得X(K) + 因此,先有X(K-1)+,已知F,G. ...
- 对Kalman(卡尔曼)滤波器的理解
1.简单介绍(Brief Introduction) 在学习卡尔曼滤波器之前,首先看看为什么叫"卡尔曼". 跟其它著名的理论(比如傅立叶变换.泰勒级数等等)一样.卡尔曼也是一个人的 ...
- 对Kalman(卡尔曼)滤波器的理解@@zz
1.简介(Brief Introduction) 在学习卡尔曼滤波器之前,首先看看为什么叫“卡尔曼”.跟其他著名的理论(例如傅立叶变换,泰勒级数等等)一样,卡尔曼也是一个人的名字,而跟他们不同的是,他 ...
随机推荐
- 在javascript中对于this指向的再次理解
总所周知,function () {}函数体内的this对象指向的是调用该函数的对象,那么我们看一下这个例子 <script> var length = 3; function fn () ...
- 基本数据类型(int,bool,str)
1.int bit_lenth() 计算整数在内存中占用的二进制码的长度 十进制 二进制 长度(bit_lenth()) 1 1 1 2 10 2 4 100 3 8 1000 4 16 10000 ...
- java中的json使用
import org.json.simple.JSONArray;import org.json.simple.JSONObject; /** * 使用的是json-lib-2.4.jar * @au ...
- mysql 临时表和内存表
查看内存表的最大值: show variables like '%heap%'; mysql> show variables like '%heap%'; +------------------ ...
- 常用的字符串方法 String ;
字符串: 1,str.charAt(num);//根据下标查找字符串中对应的字符,返回对应下标的字符; 2,str.charCodeAt(num);//字符串中下标对应的那位字符的 Unicode ...
- JAVA Web项目获取src和WebContent目录下的配置文件
一,获取src下面的配置文件信息 1,结构图如下: package com.binp.properties; import java.io.FileInputStream; import java.i ...
- SpringBoot实战(一)HelloWorld
一:环境准备: JDK:1.8版本 Maven:3.5版本(如果觉得下载速度慢,可以切换为阿里镜向地址) Intellij:2018.2.1版本 二:实际操作: 1.在Intellij中创建一个新的S ...
- 在android中,编译的项目使用到第三方jar的导入方法 终极版!
1,在android系统环境中编译自己的项目时,往往会用到第三方jar包.这些jar包在eclipse中加入编译,一路畅通,由于eclipse已经帮助你配置好了.可是当把这个项目复制到系统环境中编译时 ...
- node tail 日志服务
var http = require('http'), ,spawn = require('child_process').spawn function onRequest(req, res) { v ...
- Android Camera+SurfaceView实现自己定义拍照
对Activity强制横屏,保证预览方向正确. 使用OrientationEventListener监听设备方向.推断竖拍时,旋转照片后再保存.保证竖拍时预览图片和保存后的图片方向一致. 执行效果: ...