运动检测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实现一个简单的能够上传下载的HTTP服务器
May 05 Python
Windows下安装python MySQLdb遇到的问题及解决方法
Mar 16 Python
Python中正则表达式详解
May 17 Python
Python编程实现二叉树及七种遍历方法详解
Jun 02 Python
Python登录并获取CSDN博客所有文章列表代码实例
Dec 28 Python
Python操作MongoDB数据库的方法示例
Jan 04 Python
python版本单链表实现代码
Sep 28 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
对Python w和w+权限的区别详解
Jan 23 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 Python
运行python提示no module named sklearn的解决方法
Nov 29 Python
Python实现邮件发送的详细设置方法(遇到问题)
Jan 18 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
destoon二次开发入门示例
2014/06/20 PHP
php生成gif动画的方法
2015/11/05 PHP
深入分析PHP设计模式
2020/06/15 PHP
javascript比较文档位置
2008/04/08 Javascript
jquery 元素相对定位代码
2010/10/15 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
2017/08/30 Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
2017/09/19 jQuery
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
2018/07/10 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
layui表单验证select下拉框实现验证的方法
2019/09/05 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
[53:10]完美世界DOTA2联赛决赛日 FTD vs GXR 第二场 11.08
2020/11/11 DOTA
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
python实现统计代码行数的方法
2015/05/22 Python
python杀死一个线程的方法
2015/09/06 Python
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
Python退火算法在高次方程的应用
2018/07/26 Python
python实现三次样条插值
2018/12/17 Python
Django框架用户注销功能实现方法分析
2019/05/28 Python
Win10下python 2.7与python 3.7双环境安装教程图解
2019/10/12 Python
python requests库的使用
2021/01/06 Python
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
采购部部门职责
2013/12/15 职场文书
先进事迹报告会感言
2014/01/24 职场文书
党员政治学习材料
2014/05/14 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
python 批量压缩图片的脚本
2021/06/02 Python
html5表单的required属性使用
2021/07/07 HTML / CSS