#转
# -*- coding=utf-8 -*-
# 直接运行代码可以看到跟踪效果
# 红色的小点代表粒子位置
# 蓝色的大点表示跟踪的结果
# 白色的方框表示要跟踪的目标
# 看懂下面两个函数即可
from numpy import *
from numpy.random import * def resample(weights):
n = len(weights)
indices = []
# 求出离散累积密度函数(CDF)
C = [0.] + [sum(weights[:i+1]) for i in range(n)]
# 选定一个随机初始点
u0, j = random(), 0
for u in [(u0+i)/n for i in range(n)]: # u 线性增长到 1
while u > C[j]: # 碰到小粒子,跳过
j+=1
indices.append(j-1) # 碰到大粒子,添加,u 增大,还有第二次被添加的可能
return indices # 返回大粒子的下标 def particlefilter(sequence, pos, stepsize, n):
''' sequence: 表示图片序列
pos: 第一帧目标位置
stepsize: 采样范围
n: 粒子数目
'''
seq = iter(sequence)
x = ones((n, 2), int) * pos # 100 ``aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~!aa个初始位置(中心)
f0 = seq.next()[tuple(pos)] * ones(n) # 目标的颜色模型, 100 个 255
yield pos, x, ones(n)/n # 返回第一帧期望位置(expectation pos),粒子(x)和权重
for im in seq:
# 在上一帧的粒子周围撒点, 作为当前帧的粒子
x += uniform(-stepsize, stepsize, x.shape)#uniform()随机生成函数
# 去掉超出画面边框的粒子
x = x.clip(zeros(2), array(im.shape)-1).astype(int)
f = im[tuple(x.T)] # 得到每个粒子的像素值
w = 1./(1. + (f0-f)**2) # 求与目标模型的差异, w 是与粒子一一对应的权重向量
# 可以看到像素值为 255 的权重最大(1.0)
w /= sum(w) # 归一化 w
yield sum(x.T*w, axis=1), x, w # 返回目标期望位置,粒子和对应的权重
if 1./sum(w**2) < n/2.: # 如果当前帧粒子退化:
x = x[resample(w),:] # 根据权重重采样, 有利于后续帧有效采样 if __name__ == "__main__":
from pylab import *
from itertools import izip
import time
ion() # 打开交互模式
seq = [ im for im in zeros((20,240,320), int)] # 创建 20 帧全 0 图片
x0 = array([120, 160]) # 第一帧的框中心坐标 # 为每张图片添加一个运动轨迹为 xs 的白色方块(像素值是255, 每帧横坐标加3,竖坐标加2) xs = vstack((arange(20)*3, arange(20)*2)).T + x0 # vstack: 竖直叠加
for t, x in enumerate(xs): # t 从 0 开始, x 从 xs[0] 开始,enumerate 函数用于遍历序列中的元素以及它们的下标
# slice 的用法也很有意思,可以很方便用来表示被访问数组seq的下标范围
xslice = slice(x[0]-8, x[0]+8)
yslice = slice(x[1]-8, x[1]+8)
seq[t][xslice, yslice] = 255 # 跟踪白框
for im, p in izip(seq, particlefilter(seq, x0, 8, 100)): #
pos, xs, ws = p
position_overlay = zeros_like(im)
position_overlay[tuple(pos)] = 1
particle_overlay = zeros_like(im)
particle_overlay[tuple(xs.T)] = 1
hold(True)
draw()
time.sleep(0.3)
clf() # Causes flickering, but without the spy plots aren't overwritten
imshow(im,cmap=cm.gray) # Plot the image spy(position_overlay, marker='.', color='b') # Plot the expected position spy(particle_overlay, marker=',', color='r') # Plot the particles show()

Python 实现粒子滤波的更多相关文章

  1. 从贝叶斯到粒子滤波——Round 1

    粒子滤波确实是一个挺复杂的东西,从接触粒子滤波到现在半个多月,博主哦勒哇看了N多篇文章,查略了嗨多资料,很多内容都是看了又看,细细斟酌.今日,便在这里验证一下自己的修炼成果,请各位英雄好汉多多指教. ...

  2. 从贝叶斯到粒子滤波——Round 2

    上一篇博文已经讲了贝叶斯滤波的原理以及公式的推导:http://www.cnblogs.com/JunhaoWu/p/bayes_filter.html 本篇文章将从贝叶斯滤波引入到粒子滤波,讲诉粒子 ...

  3. 粒子滤波particle filter和目标跟踪

    粒子滤波用于跟踪,参考:http://www.cnblogs.com/tornadomeet/archive/2012/03/18/2404817.html http://blog.csdn.net/ ...

  4. 学习OpenCV——粒子滤波(网上两篇文章总结)

    粒子滤波的理论实在是太美妙了,用一组不同权重的随机状态来逼近复杂的概率密度函数.其再非线性.非高斯系统中具有优良的特性.opencv给出了一个实现,但是没有给出范例,学习过程中发现网络上也找不到.le ...

  5. 基于粒子滤波的物体跟踪 Particle Filter Object Tracking

    Video来源地址 一直都觉得粒子滤波是个挺牛的东西,每次试图看文献都被复杂的数学符号搞得看不下去.一个偶然的机会发现了Rob Hess(http://web.engr.oregonstate.edu ...

  6. 粒子滤波(PF:Particle Filter)

    先介绍概念:来自百科 粒子滤波指:通过寻找一组在状态空间中传播的随机样本来近似的表示概率密度函数,再用样本均值代替积分运算,进而获得系统状态的最小方差估计的过程,波动最小,这些样本被形象的称为&quo ...

  7. 粒子滤波跟踪移动机器人(MATLAB Robotics System Toolbox)

    MathWorks从MATLAB 2015a开始推出与ROS集成的Robotics System Toolbox(机器人系统工具箱),它为自主移动机器人的研发提供现成的算法和硬件接口. 粒子滤波基本流 ...

  8. 机器学习理论基础学习14.2---线性动态系统-粒子滤波 particle filter

    一.背景 与卡曼滤波不同的是,粒子滤波假设隐变量之间(隐变量与观测变量之间)是非线性的,并且不满足高斯分布,可以是任意的关系. 求解的还是和卡曼滤波一样,但由于分布不明确,所以需要用采样的方法求解. ...

  9. 理解粒子滤波(particle filter)

    1)初始化阶段-提取跟踪目标特征 该阶段要人工指定跟踪目标,程序计算跟踪目标的特征,比如可以采用目标的颜色特征.具体到Rob Hess的代码,开始时需要人工用鼠标拖动出一个跟踪区域,然后程序自动计算该 ...

随机推荐

  1. 快学Java NIO

    Java NIO Tutorial 地址:http://tutorials.jenkov.com/java-nio/index.html Java NIO系列教程译文地址:http://ifeve.c ...

  2. ZOJ3195 Design the city(LCA)

    题目大概说给一棵树,每次询问三个点,问要把三个点连在一起的最少边权和是多少. 分几种情况..三个点LCA都相同,三个点有两对的LCA是某一点,三个点有两对的LCA各不相同...%……¥…… 画画图可以 ...

  3. EF框架step by step(2)—Model-First

    这一篇主要说一下EF框架中,Model First做法,仍然采用上一篇的案例.但增加评论功能.首先打开Blog.edmx文件,在空白处右键,添加新实体Comment,如下图示: 点击确定,关闭窗口. ...

  4. oracle查看表实际物理空间使用大小

    http://www.2cto.com/database/201107/95313.html 一种是分配给一个表的物理空间数量,而不管空间是否被使用.可以这样查询获得字节数:select segmen ...

  5. 2014-2015 ACM-ICPC, NEERC, Moscow Subregional Contest F. Friends

    F. Friends time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...

  6. Visual Studio蛋疼问题解决

    监视变量显示未定义标识符: VS2012在编译的时候采用了较快的编译模式,所以有些变量就显示未定义了.  解决方案:  项目->属性->c/c++->优化->改为禁用/OD  ...

  7. Redis内存缓存系统入门

    网站:http://redis.io/ key-value cache and store    data structure server 1. 服务器端 1.1 安装 下载安装包:http://r ...

  8. Spring Assert(方法入参检测工具类-断言)

    Web 应用在接受表单提交的数据后都需要对其进行合法性检查,如果表单数据不合法,请求将被驳回.类似的,当我们在编写类的方法时,也常常需要对方法入参进行合 法性检查,如果入参不符合要求,方法将通过抛出异 ...

  9. CSS3弹性盒模型flexbox布局基础版

    原文链接:http://caibaojian.com/using-flexbox.html 最近看了社区上的一些关于flexbox的很多文章,感觉都没有我这篇文章实在,最重要的兼容性问题好多人都没有提 ...

  10. POJ 1753 (开关问题+高斯消元法)

    题目链接: http://poj.org/problem?id=1753 题目大意:一堆格子,或白或白.每次可以把一个改变一个格子颜色,其上下左右四个格子颜色也改变.问最后使格子全部白或全部黑,求最小 ...