运动检测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中Genarator函数用法分析
Apr 08 Python
利用Python实现Windows定时关机功能
Mar 21 Python
Python实现Mysql数据库连接池实例详解
Apr 11 Python
深入理解python中的select模块
Apr 23 Python
python和shell监控linux服务器的详细代码
Jun 22 Python
Tensorflow 实现修改张量特定元素的值方法
Jul 30 Python
Django中间件拦截未登录url实例详解
Sep 03 Python
Python对接支付宝支付自实现功能
Oct 10 Python
python实现广度优先搜索过程解析
Oct 19 Python
Python多进程编程multiprocessing代码实例
Mar 12 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
Nov 02 Python
如何利用Matlab制作一款真正的拼图小游戏
May 11 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
各种战术和打法的原创者
2020/03/04 星际争霸
一个分页的论坛
2006/10/09 PHP
PHP 数组基础知识小结
2010/08/20 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
PHP+JQUERY操作JSON实例
2017/03/23 PHP
Firefox window.close()的使用注意事项
2009/04/11 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
JavaScript学习小结(一)——JavaScript入门基础
2015/09/02 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
Echarts地图添加引导线效果(labelLine)
2019/09/30 Javascript
[01:10:02]IG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python对象的深拷贝和浅拷贝详解
2014/08/25 Python
Python中用Spark模块的使用教程
2015/04/13 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
python 定时器每天就执行一次的实现代码
2019/08/14 Python
python图片剪裁代码(图片按四个点坐标剪裁)
2020/03/10 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
HTML5中如何显示视频呢 HTML5视频播放demo
2013/06/08 HTML / CSS
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
Otticanet意大利:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
学习十八大报告感言
2014/02/28 职场文书
阅兵口号
2014/06/19 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
公司催款律师函
2015/05/27 职场文书
婚宴领导致辞
2015/07/28 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers
Redis全局ID生成器的实现
2022/06/05 Redis
使用CSS实现按钮边缘跑马灯动画
2023/05/07 HTML / CSS