运动检测ViBe算法python实现代码


Posted in Python onJanuary 09, 2018

运动物体检测一般分为背景建模和运动物体分析两步。即构建不包含运动物体的背景模型。然后将新的视频帧和背景模型对比,找出其中的运动物体。目前比较好的背景建模算法有两种:1)文章(Zivkovic Z. (2004) Improved adaptive Gausianmixture model for  backgroundsubtraction, Proceedings of ICPR 2004, August 23-26, Cambridge, UK.)提出的高斯混合模型法。在此算法中,背景的每一个像素都被拟合到一个高斯混合模型。对于新的图片,只需要判断每个像素是否服从这个高斯混合模型就可以判断出这个像素是背景还是前景。但混合高斯算法的缺点是计算量相对比较大,速度偏慢,对光照敏感。2)文章(ViBe: A universal backgroundsubtraction algorithm for video sequences.)提出的ViBe算法。该算法速度非常快,计算量比较小,而且对噪声有一定的鲁棒性,检测效果不错。

由于最近在做一些跟踪检查的研究,就用到了ViBe算法,根据网上的c++版本编写了这个python版的算法,在这分享给大家。

class ViBe: 
 ''''' 
 classdocs 
 ''' 
 __defaultNbSamples = 20  #每个像素点的样本个数 
 __defaultReqMatches = 2  #min指数 
 __defaultRadius = 20;   #Sqthere半径 
 __defaultSubsamplingFactor = 16#子采样概率 
 __BG = 0      #背景像素 
 __FG = 255      #前景像素 
 __c_xoff=[-1,0,1,-1,1,-1,0,1,0] #x的邻居点 len=9 
 __c_yoff=[-1,0,1,-1,1,-1,0,1,0] #y的邻居点 len=9 
  
 __samples=[]    #保存每个像素点的样本值,len defaultNbSamples+1 
 __Height = 0 
 __Width = 0 
 
 def __init__(self, grayFrame): 
  ''''' 
  Constructor 
  ''' 
  self.__Height = grayFrame.shape[0] 
  self.__Width = grayFrame.shape[1] 
   
 
  for i in range(self.__defaultNbSamples+1): 
   self.__samples.insert(i,np.zeros((grayFrame.shape[0],grayFrame.shape[1]),dtype=grayFrame.dtype)); 
    
  self.__init_params(grayFrame) 
  
 def __init_params(self,grayFrame): 
  #记录随机生成的 行(r) 和 列(c) 
  rand=0 
  r=0 
  c=0 
 
  #对每个像素样本进行初始化 
  for y in range(self.__Height): 
   for x in range(self.__Width): 
    for k in range(self.__defaultNbSamples): 
     #随机获取像素样本值 
     rand=random.randint(0,8) 
     r=y+self.__c_yoff[rand] 
     if r<0: 
      r=0 
     if r>=self.__Height: 
      r=self.__Height-1 #行 
     c=x+self.__c_xoff[rand] 
     if c<0: 
      c=0 
     if c>=self.__Width: 
      c=self.__Width-1  #列 
     #存储像素样本值 
     self.__samples[k][y,x] = grayFrame[r,c] 
   self.__samples[self.__defaultNbSamples][y,x] = 0 
    
 def update(self,grayFrame,frameNo): 
  foreground = np.zeros((self.__Height,self.__Width),dtype=np.uint8) 
  for y in range(self.__Height): #Height 
   for x in range(self.__Width):  #Width 
    #用于判断一个点是否是背景点,index记录已比较的样本个数,count表示匹配的样本个数 
    count=0;index=0; 
    dist=0.0; 
    while (count<self.__defaultReqMatches) and (index<self.__defaultNbSamples): 
     dist= float(grayFrame[y,x]) - float(self.__samples[index][y,x]); 
     if dist<0: dist=-dist 
     if dist<self.__defaultRadius: count = count+1 
     index = index+1 
 
    if count>=self.__defaultReqMatches: 
     #判断为背景像素,只有背景点才能被用来传播和更新存储样本值 
     self.__samples[self.__defaultNbSamples][y,x]=0 
  
     foreground[y,x] = self.__BG 
  
     rand=random.randint(0,self.__defaultSubsamplingFactor) 
     if rand==0: 
      rand=random.randint(0,self.__defaultNbSamples) 
      self.__samples[rand][y,x]=grayFrame[y,x] 
     rand=random.randint(0,self.__defaultSubsamplingFactor) 
     if rand==0: 
      rand=random.randint(0,8) 
      yN=y+self.__c_yoff[rand] 
      if yN<0: yN=0 
      if yN>=self.__Height: yN=self.__Height-1 
      rand=random.randint(0,8) 
      xN=x+self.__c_xoff[rand] 
      if xN<0: xN=0 
      if xN>=self.__Width: xN=self.__Width-1 
      rand=random.randint(0,self.__defaultNbSamples) 
      self.__samples[rand][yN,xN]=grayFrame[y,x] 
    else: 
     #判断为前景像素 
     foreground[y,x] = self.__FG; 
     self.__samples[self.__defaultNbSamples][y,x] += 1 
     if self.__samples[self.__defaultNbSamples][y,x]>50: 
      rand=random.randint(0,self.__defaultNbSamples) 
      if rand==0: 
       rand=random.randint(0,self.__defaultNbSamples) 
       self.__samples[rand][y,x]=grayFrame[y,x] 
  return foreground

我做的鱼的跟踪效果图

运动检测ViBe算法python实现代码

运动检测ViBe算法python实现代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python logging类库使用例子
Nov 22 Python
Python读写txt文本文件的操作方法全解析
Jun 26 Python
python检索特定内容的文本文件实例
Jun 05 Python
Python中判断子串存在的性能比较及分析总结
Jun 23 Python
Python数据类型之列表和元组的方法实例详解
Jul 08 Python
python中的subprocess.Popen()使用详解
Dec 25 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
python中sys模块是做什么用的
Aug 16 Python
python文件路径操作方法总结
Dec 21 Python
详解Django中的FBV和CBV对比分析
Mar 01 Python
Python中OpenCV实现查找轮廓的实例
Jun 08 Python
Python可变集合和不可变集合的构造方法大全
Dec 06 Python
python+opencv实现动态物体识别
Jan 09 #Python
Python设计模式之门面模式简单示例
Jan 09 #Python
Python和Java进行DES加密和解密的实例
Jan 09 #Python
Python设计模式之中介模式简单示例
Jan 09 #Python
python+opencv实现动态物体追踪
Jan 09 #Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 #Python
Python设计模式之代理模式简单示例
Jan 09 #Python
You might like
php简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
php 使用curl模拟登录人人(校内)网的简单实例
2016/06/06 PHP
js每次Title显示不同的名言
2008/09/25 Javascript
重载toString实现JS HashMap分析
2011/03/13 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
2016/04/17 Javascript
JS实现微信弹出搜索框 多条件查询功能
2016/12/13 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
inner join 内联与left join 左联的实例代码
2017/09/18 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
2020/05/23 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
python实现通过shelve修改对象实例
2014/09/26 Python
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
Python爬虫基础之XPath语法与lxml库的用法详解
2018/09/13 Python
对python requests的content和text方法的区别详解
2018/10/11 Python
详解python如何在django中为用户模型添加自定义权限
2018/10/15 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
Python给图像添加噪声具体操作
2019/03/03 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
2020/01/21 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
RIP版本1跟版本2的区别
2013/12/30 面试题
团队口号大全
2014/06/06 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
2014年工程部工作总结
2014/11/25 职场文书
个人创业事迹材料
2014/12/30 职场文书
毕业实习证明范本
2015/06/16 职场文书
单独二胎证明
2015/06/24 职场文书