目标跟踪的kalman滤波器介绍


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

  对视频进行运动目标检测,通过简单匹配方法来给出目标的第一个和第二个状态,从第三个状态开始,就先使用kalman滤波器预测出当前状态,再用当前帧图像的检测结果作为观测值输入给kalman滤波器,得到的校正结果就被认为是目标在当前帧的真实状态。

有何问题?


  上面是大部分的做法,包括opencv都是如此实现的。但是,上面所述的使用方法也存在一定的问题。通常的监控场景都存在景深,一般而言,相机俯角不会太大(通常小于30度),那么在视频中同一个人在近处会比远处大很多,同样的其速度也会大很多(这里也假设目标真实世界中是匀速运动)。比如近端1个像素代表5mm,那么在远端则可能代表10mm,那人的大小和速度在近端都要大1倍。这样表现出来的现象就是对从近向远运动的目标,其输出的大小比实际大小大,位置会稍微超前;反之,从远向近运动的目标的输出状态大小则比实际大小小,位置会滞后。

如何解决?


  通常见过一种做法,是把目标状态向量扩展为(x,y,w,h,dx,dy,ax,ay,dw,dh),其中ax,ay表示目标加速度,dw,dh表示目标大小的变化速度,相当于假定了目标在视频中是匀变速运动,且其宽高也在匀速变化。但是实际测试来看,该做法效果一般,并不能有效解决上述问题,目前原因不是很明确,估计是由于成像景深并不能满足上面的假设(即目标匀变速运动,宽高匀速变化这一假设)。

  另一种有效的方法是把图像中的目标状态转换到真实状态,即是从图像坐标系映射到世界坐标系。在视频中目标任意一个确定状态(x,y,w,h)都可以唯一对应到真实世界中的(x1,y1,w1,h1),那么在真实世界中,目标通常是满足宽高不变,匀速运动的假设条件的,那么就可以使用kalman滤波器,最终只要将结构反映射回图像坐标系即可。  

  当然,需要做这样的映射,就必须要确定相机的架设参数,包括高度,俯角和焦距。架设固定后,高度可直接给出,焦距和俯角可以在此基础上通过视频标定计算出。另外一种情况是双目/多目成像,有2个或多个相机同时成像就可以直接实现目标在坐标系的转换,这一点是当时在几篇论文上看到的,实际没这么做过。

  对于上面的视频标定,有时候可能显得过于麻烦,且计算也没那么方便,这时我们可以退一步来考虑,基于前面的假设,可以确定只要目标在同一种度量下,目标的大小和速度也会保持不变,那就可以简单点把图像中的目标都映射到图像同一位置后再进行kalman滤波,做法和映射到世界坐标系一样,但是该方法的标定就更为简单了,只要分别标出一个近景远景框即可,完全不需要理会相机架设参数。

  当时的实验结果来看,采用近景远景框标定,只要标定准确,上述做法能完全解决直接在图像中使用kalman滤波的问题。

运动目标跟踪中kalman滤波器的使用的更多相关文章

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

    预估器 我们希望能够最大限度地使用測量结果来预计移动物体的运动. 所以,多个測量的累积能够让我们检測出不受噪声影响的部分观測轨迹. 一个关键的附加要素即此移动物体运动的模型. 有了这个模型,我们不仅能 ...

  2. Kalman滤波器原理和实现

    Kalman滤波器原理和实现 kalman filter Kalman滤波器的直观理解[1] 假设我们要测量一个房间下一刻钟的温度.据经验判断,房间内的温度不可能短时大幅度变化,也就是说可以依经验认为 ...

  3. Video Target Tracking Based on Online Learning—深度学习在目标跟踪中的应用

    摘要 近年来,深度学习方法在物体跟踪领域有不少成功应用,并逐渐在性能上超越传统方法.本文先对现有基于深度学习的目标跟踪算法进行了分类梳理,后续会分篇对各个算法进行详细描述. 看上方给出的3张图片,它们 ...

  4. Kalman滤波器从原理到实现

    Kalman滤波器的历史渊源 We are like dwarfs on the shoulders of giants, by whose grace we see farther than the ...

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

    终于成功仿了一次Kalman滤波器 首先是测试了从网上down的一段代码 % KALMANF - updates a system state vector estimate based upon a ...

  6. 关于视觉跟踪中评价标准的相关记录(The Evaluation of Visual Tracking Results on OTB-100 Dataset)

    关于视觉跟踪中评价标准的相关记录(The Evaluation of Visual Tracking Results on OTB-100 Dataset) 2018-01-22  21:49:17 ...

  7. 运动目标检测中基于HSV空间的阴影去除算法

    在运动目标检测中,常常会出现由于光线被遮挡,或场景其他物体的遮挡,在目标附近或场景里出现阴影,阴影的出现对后期目标的正确分割与处理带了很大的不便.如今,国内外已有不少文献来研究这个问题,并且提出了各种 ...

  8. CVE-2020-0668-Windows服务跟踪中的普通特权升级错误

    CVE-2020-0668-Windows服务跟踪中的普通特权升级错误 在这里中,我将讨论在Windows Service跟踪中发现的任意文件移动漏洞.从我的测试来看,它影响了从Vista到10的所有 ...

  9. Opencv-Python项目(1) | 基于meanshiftT算法的运动目标跟踪技术学习

    目标跟踪(object tracking)就是在连续的视频序列中,建立所要跟踪物体的位置关系,得到物体完整的运动轨迹. 目标跟踪分为单目标跟踪和多目标跟踪.本文如无特别指出,均指单目标跟踪. 通常的做 ...

随机推荐

  1. 流量分析系统---kafka集群部署

    1.集群部署的基本流程 Storm上游数据源之Kakfa 下载安装包.解压安装包.修改配置文件.分发安装包.启动集群 2.基础环境准备 安装前的准备工作(zk集群已经部署完毕)  关闭防火墙 chk ...

  2. flex 实现图片播放 方案一 图片全部预加载放内存

    这种方案,对于web的应用有局限性,在图片量比较多,比较大的时候,就会爆浏览器异常.一般建议轻量级的采用这种方案. <?xml version="1.0" encoding= ...

  3. linux systemctl 指令 —— 阮一峰

    Systemd 指令 原文链接如果有效,请点击原文链接查看.原文:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.ht ...

  4. bootstrap table 复选框使用

    var columns = [ { field : 'checked', checkbox: true, align: 'center', valign: 'middle', formatter:fu ...

  5. ETL应用:使用Pro*C写入文件信息入库的方法

    ETL处理过程中,经常需要进行文件校验,如文件级校验.记录级校验,需要保存文件的基本信息,文件名.文件大小.数据日期等,使用Pro*C的一种方法如下: #include <stdio.h> ...

  6. python对象类型----数字&字符串

    一数据类型:      float: 1.3e-3  1.3*10的负三次方 print (1.3e-3)    bin()  #转换为二进进制    oct() #转换为8进制    hex()#转 ...

  7. ubuntu ssh免密码登录

    目前很多服务(ceph,openstack等)都需要用到SSH使用ssh-key进行登录,而不能使用密码进行登录. 下面是配置步骤: 一.在SSH Client生成ssh key pair root@ ...

  8. Python 字典Dict概念和操作

    # 字典概念:无序的, 可变的键值对集合 # 定义 # 方式1 # {key: value, key: value...} # 例如 # {"name": "xin&qu ...

  9. 【简单dp】poj 2127 Greatest Common Increasing Subsequence【最长公共上升子序列】【模板】

    Sample Input 5 1 4 2 5 -12 4 -12 1 2 4 Sample Output 2 1 4 题目:给你两个数字序列,求出这两个序列的最长公共上升子序列.输出最长的长度,并打表 ...

  10. freemarker空值的处理

    FreeMarker的变量必须赋值,否则就会抛出异常.而对于FreeMarker来说,null值和不存在的变量是完全一样的,因为FreeMarker无法理解null值.FreeMarker提供两个运算 ...