运动检测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协议下的文件下载方法总结
Apr 20 Python
读写json中文ASCII乱码问题的解决方法
Nov 05 Python
Python+selenium 获取一组元素属性值的实例
Jun 22 Python
python中map的基本用法示例
Sep 10 Python
python try except 捕获所有异常的实例
Oct 18 Python
python 通过手机号识别出对应的微信性别(实例代码)
Dec 22 Python
pytorch 归一化与反归一化实例
Dec 31 Python
如何让python的运行速度得到提升
Jul 08 Python
Python基于xlrd模块处理合并单元格
Jul 28 Python
基于python+selenium自动健康打卡的实现代码
Jan 13 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
Jan 27 Python
python定义具名元组实例操作
Feb 28 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 静态页面中显示动态内容
2009/08/14 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
JavaScript 学习笔记之数据类型
2015/01/14 Javascript
Javascript函数的参数
2015/07/16 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
jquery实现图片水平滚动效果代码分享
2015/08/26 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
浅谈React和Redux的连接react-redux
2017/12/04 Javascript
js数组方法reduce经典用法代码分享
2018/01/07 Javascript
js合并两个数组生成合并后的key:value数组
2018/05/09 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
2018/09/02 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
2019/12/06 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
Jquery+javascript实现支付网页数字键盘
2020/12/21 jQuery
[01:40]2014DOTA2国际邀请赛 三冰SOLO赛后采访恶搞
2014/07/09 DOTA
Python linecache.getline()读取文件中特定一行的脚本
2008/09/06 Python
Python复制目录结构脚本代码分享
2015/03/06 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
Python 脚本实现淘宝准点秒杀功能
2019/11/13 Python
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
Delphi CS笔试题
2014/01/04 面试题
授权委托书怎么写
2014/09/25 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
应聘教师自荐信
2015/03/26 职场文书
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技