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

运动物体检测一般分为背景建模和运动物体分析两步。即构建不包含运动物体的背景模型。然后将新的视频帧和背景模型对比,找出其中的运动物体。目前比较好的背景建模算法有两种: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+opencv实现动态物体追踪
  • python结合opencv实现人脸检测与跟踪
(0)

相关推荐

  • python结合opencv实现人脸检测与跟踪

    模式识别课上老师留了个实验,在VC++环境下利用OpenCV库编程实现人脸检测与跟踪. 然后就开始下载opencv和vs2012,再然后,配置了好几次还是配置不成功,这里不得不吐槽下微软,软件做这么大,这么难用真的好吗? 于是就尝试了一下使用python完成实验任务,大概过程就是这样子的: 首先,配置运行环境: 下载opencv和python的比较新的版本,推荐opencv2.4.X和python2.7.X. 直接去官网下载就ok了,python安装时一路next就行,下载的opencv.exe

  • python+opencv实现动态物体追踪

    简单几行就可以实现对动态物体的追踪,足见opencv在图像处理上的强大. python代码: import cv2 import numpy as np camera=cv2.VideoCapture(0) firstframe=None while True: ret,frame = camera.read() if not ret: break gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) gray=cv2.GaussianBlur(gray,(21

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

    运动物体检测一般分为背景建模和运动物体分析两步.即构建不包含运动物体的背景模型.然后将新的视频帧和背景模型对比,找出其中的运动物体.目前比较好的背景建模算法有两种:1)文章(Zivkovic Z. (2004) Improved adaptive Gausianmixture model for  backgroundsubtraction, Proceedings of ICPR 2004, August 23-26, Cambridge, UK.)提出的高斯混合模型法.在此算法中,背景的每一

  • 数据挖掘之Apriori算法详解和Python实现代码分享

    关联规则挖掘(Association rule mining)是数据挖掘中最活跃的研究方法之一,可以用来发现事情之间的联系,最早是为了发现超市交易数据库中不同的商品之间的关系.(啤酒与尿布) 基本概念 1.支持度的定义:support(X-->Y) = |X交Y|/N=集合X与集合Y中的项在一条记录中同时出现的次数/数据记录的个数.例如:support({啤酒}-->{尿布}) = 啤酒和尿布同时出现的次数/数据记录数 = 3/5=60%. 2.自信度的定义:confidence(X-->

  • Python用户推荐系统曼哈顿算法实现完整代码

    出租车几何或曼哈顿距离(Manhattan Distance)是由十九世纪的赫尔曼·闵可夫斯基所创词汇 ,是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和. 图中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的曼哈顿距离.曼哈顿距离--两点在南北方向上的距离加上在东西方向上的距离,即d(i,j)=|xi-xj|+|yi-yj|.对于一个具有正南正北.正东正西方向规则布局的城镇街道,从一点到达另一点的距离正是在南北方向上旅行的距离加上在东西

  • K-近邻算法的python实现代码分享

    k-近邻算法概述: 所谓k-近邻算法KNN就是K-Nearest neighbors Algorithms的简称,它采用测量不同特征值之间的距离方法进行分类 用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中. k-近邻算法分析 优点:精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围:数值型和标称型 k-

  • python实现kmp算法的实例代码

    kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置 比如 abababc 那么bab在其位置1处,bc在其位置5处 我们首先想到的最简单的办法就是蛮力的一个字符一个字符的匹配,但那样的时间复杂度会是O(m*n) kmp算法保证了时间复杂度为O(m+n) 基本原理 举个例子: 发现x与c不同后,进行移动 a与x不同,再次移动 此时比较到了c与y, 于是下一步移动成了下面这样 这一次的移动与前两次的移动不同,之前每次比较到上面长字符串的字符位置后,直接把模

  • Python实现隐马尔可夫模型的前向后向算法的示例代码

    本篇文章对隐马尔可夫模型的前向和后向算法进行了Python实现,并且每种算法都给出了循环和递归两种方式的实现. 前向算法Python实现 循环方式 import numpy as np def hmm_forward(Q, V, A, B, pi, T, O, p): """ :param Q: 状态集合 :param V: 观测集合 :param A: 状态转移概率矩阵 :param B: 观测概率矩阵 :param pi: 初始概率分布 :param T: 观测序列和状态

  • k-means 聚类算法与Python实现代码

    k-means 聚类算法思想先随机选择k个聚类中心,把集合里的元素与最近的聚类中心聚为一类,得到一次聚类,再把每一个类的均值作为新的聚类中心重新聚类,迭代n次得到最终结果分步解析 一.初始化聚类中心 首先随机选择集合里的一个元素作为第一个聚类中心放入容器,选择距离第一个聚类中心最远的一个元素作为第二个聚类中心放入容器,第三.四...N个同理,为了优化可以选择距离开方做为评判标准 二.迭代聚类 依次把集合里的元素与距离最近的聚类中心分为一类,放到对应该聚类中心的新的容器,一次聚类完成后求出新容器里

  • Python实现七个基本算法的实例代码

    1.顺序查找 当数据存储在诸如列表的集合中时,我们说这些数据具有线性或顺序关系. 每个数据元素都存储在相对于其他数据元素的位置. 由于这些索引值是有序的,我们可以按顺序访问它们. 这个过程产实现的搜索即为顺序查找. 顺序查找原理剖析:从列表中的第一个元素开始,我们按照基本的顺序排序,简单地从一个元素移动到另一个元素,直到找到我们正在寻找的元素或遍历完整个列表.如果我们遍历完整个列表,则说明正在搜索的元素不存在. 代码实现:该函数需要一个列表和我们正在寻找的元素作为参数,并返回一个是否存在的布尔值

  • python实现经典排序算法的示例代码

    以下排序算法最终结果都默认为升序排列,实现简单,没有考虑特殊情况,实现仅表达了算法的基本思想. 冒泡排序 内层循环中相邻的元素被依次比较,内层循环第一次结束后会将最大的元素移到序列最右边,第二次结束后会将次大的元素移到最大元素的左边,每次内层循环结束都会将一个元素排好序. def bubble_sort(arr): length = len(arr) for i in range(length): for j in range(length - i - 1): if arr[j] > arr[j

  • Python实现七大查找算法的示例代码

    查找算法 -- 简介 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素.     查找表(Search Table):由同一类型的数据元素构成的集合     关键字(Key):数据元素中某个数据项的值,又称为键值     主键(Primary Key):可唯一的标识某个数据元素或记录的关键字 查找表按照操作方式可分为:         1.静态查找表(Static Search Table):只做查找操作的查找表.它的主要操作是:         ①

随机推荐