侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   457

运动物体检测一般分为背景建模和运动物体分析两步。即构建不包含运动物体的背景模型。然后将新的视频帧和背景模型对比,找出其中的运动物体。目前比较好的背景建模算法有两种: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 

我做的鱼的跟踪效果图

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


  • 上一条:
    Python numpy实现数组合并实例(vstack,hstack)
    下一条:
    python+opencv实现动态物体识别
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客