1,CodeBook的来源
  先考虑平均背景的建模方法。该方法是针对每一个像素,累积若干帧的像素值,然后计算平均值和方差,以此来建立背景模型,相当于模型的每一个像素含有两个特征值,这两个特征值只是单纯的统计量,没有记录该像素值的历史起伏,即没有考虑时间序列和噪声干扰,不具备鲁棒性,因此建模时不能有运动前景的部分,要求光线保持不变。
  如果我们考虑到时间起伏序列建模,比如利用60帧图像建模,对于每一个像素点会产生60个像素值,分别给他们加上60个相关的权值,或者进一步统计不同像素值出现的频次或者距离,以此来排除噪声,这样能够模拟复杂的背景,但是会带来巨大的内存消耗。
  如果我们对该像素值起伏的动态范围进行压缩,压缩的依据是像素值之间的大小距离,即当前观测值与历史的记录值对比,如果两个值接近,就归为一类,也就是隶属同一个码元(CodeWord),如果差别过大,就以当前观测值新建一个码元,因为背景的变化情况远小于前景,所以压缩之后我们就得到了只含有若个码元的一个编码本(CodeBook),这个编码本不仅能够模拟复杂背景,同时大大减少内存消耗。此外,对每个码元的更新频率进行监督,剔除那些频率低的(误跑进来的动态前景),不仅排除了噪声,同时也允许有移动前景的背景当做学习资料。这便是CodeBook的核心思想。
2,CodeBook的实现
  CodeBook执行前景分割主要分为三个过程,即背景建模、清除陈旧码元、前景分割,分别对应如下三个函数updateCodeBook(), clearStaleEntries(), backgroudDiff()。
2.1 结构及主要参数
  CodeBook算法为当前图像的每一个像素建立一个CodeBook(CB)结构,每个CodeBook结构又由多个码元CodeWord(CW)组成。
  CB和CW的形式如下:
  CB={CW1,CW2,…CWn,t}
  CW={learnHigh[],learnLow[],max[],min[],t_last_updata,stale}
  其中n为一个CB中所包含的CW的数目,当n太小时,退化为简单背景,当n较大时可以对复杂背景进行建模。CW是一个6元组结构,在整个算法流程中,主要包括以下参数:
  maxMod[]:用训练好的背景模型进行前景分割时的调节量,判断点是否小于max[] + maxMod[]);
  minMod[]:用训练好的背景模型进行前景分割时的调节量,判断点是否小于min[] -minMod[]);
  cbBounds[]:训练背景模型时用到,相当于控制模型的增长速率,更新learnHigh[]和learnLow[]。
  learnHigh[]:背景的学习上界限,当新像素进来时判断其是否属于该码元;
  learnLow[]:背景的学习下界限,当新像素进来时判断其是否属于该码元;
  max[]: 背景学习中不断更新,记录当前码元的最大值,在前景分割时,与MaxMod[]配合,判断像素是前景还是背景;
  min[]: 背景学习中不断更新,记录当前码元的最小值,在前景分割时,与MinMod[]配合,判断像素是前景还是背景;
  此外,为了剔除陈旧码元,给每个CB和CW都加入了若干时间标签,比如CB的t,记录CB更新的次数,CW的t_last_updata和stale,t_last_updata记录了该CW上次更新的时间,stale记录了CW的搁浅时间,stale=t-l_last_updata。
2.2 背景建模
  遍历每一个像素,假设针对某个像素I(x,y),遍历其对应的CodeBook的每一个码元,分通道检测learnHighI(x,y)learnLow?如果满足条件,则更新该码元的t_last_updata,若max<I(x,y),更新max=I(x,y), 若min>I(x,y), 更新min=I(x, y),若learnHigh<I(x,y)+cbBounds,缓慢增加学习上限learnHigh+1, 若learnLow>I(x,y)-cbBounds,降低学习下线learnLow-1。
  如果不满足条件,则创建一个新的码元,learnHign=I(x,y)+cbBounds,learnLow=I(x,y)-cbBounds, max=min=I(x,y)。
  更新所有的时间标签。
2.3 清除陈旧码元
  背景建模一段时间后,需要定期清除陈旧码元,针对每一个CodeBook,根据经验将其时间t的一半当做阈值,遍历所有码元,将与之对应的时间标签stale与阈值比较,大于阈值的则删除,阈值之内的保留,同时更新时间标签。
2.4,前景分割
  前景分割也就是利用训练好的CodeBook进行运动检测,遍历该像素对应的CodeBook的所有码元,如果其中一个码元满足当前像素I(x,y)min-minMod且I(x,y)max+maxMod,则判断该像素属于背景,如果一个条件不满足,则属于前景。
3,CodeBook的优缺点以及改进
  优点:
  室内室外都能工作很好,能够适应小范围周期性运动的背景(经典例子,风中摇曳的树)以及灯光缓慢变化或者有规律的变化,训练过程不需要完全干净无前景的背景,适应有前景目标移动的背景建模。
  不足:
  如果背景发生全局变化,比如打开或者关闭灯,不同时候的阳光,这个时候密码本会失效。解决方法:针对可能出现的全局背景,训练不同背景下的CodeBook,并自动检测背景环境进行模型切换。
  背景局部发生变化,背景与前景都是相对而言,比如背景里进入一辆汽车,汽车停止不再移动,变成背景的一部分,CodeBook并不能判断这一类情形。解决方法:多层CodeBook建模,一层永久背景模型,一层缓存背景模型,如果部分前景在混存背景模型存在时间足够长,则移入永久背景模型进行检测。
此外,我们比较的特征都是基于像素值这一最原始的特征,可以提取一些加工过的特征比如Gaussian/LBP来建立CodeBook.
4,参考资料
《学习OpenCV》;
百度百科——codebook;
Tornadomeet博客——前景检测算法_1(codebook和平均背景法)
  
  
  
  
  
  
  

  

OpenCV ——背景建模之CodeBook(2)的更多相关文章

  1. OpenCV ——背景建模之CodeBook(1)

    1,CodeBook算法流程介绍 CodeBook算法的基本思想是得到每个像素的时间序列模型.这种模型能很好地处理时间起伏,缺点是需要消耗大量的内存.CodeBook算法为当前图像的每一个像素建立一个 ...

  2. OpenCV4Android背景建模(MOG、MOG2)

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃     很久以前的笔记了,分享给大家吧...OpenCV4Android中用于背景建模的类主要 ...

  3. OpenCV笔记(6)(harris角点检测、背景建模)

    一.Harris角点 如上图所示,红色框AB都是平面,蓝色框CD都是边缘,而绿色框EF就是角点. 平面:框往X或Y抽移动,变化都很小. 边缘:框沿X或Y轴移动,其中一个变化很小,而另外一个变化比较大. ...

  4. [MOC062066]背景建模资料收集整理

    一.相关博客 背景建模相关资料收集,各个链接都已给出. 资料,不可能非常完整,以后不定期更新. -----------------切割线----------------- 这个哥们总结的非常好啊,看完 ...

  5. 背景建模技术(七):预处理(PreProcessor)模块

    预处理(PreProcessor)模块是BgsLibrary中一个必选的模块,是真正进入背景建模算法的“预处理”过程,其主要功能包括‘去模糊’.‘获得灰度图’.'应用Canny算子‘等可选模块. 下面 ...

  6. 背景建模技术(三):背景减法库(BGS Library)的基本框架与入口函数main()的功能

    背景减法库(BGS Library = background subtraction library)包含了37种背景建模算法,也是目前国际上关于背景建模技术研究最全也最权威的资料.本文将更加详细的介 ...

  7. 【背景建模】SOBS

    SOBS(self-Organizing through artificial neural networks)是一种基于自组织神经网络的背景差分算法,主要是借鉴神经网络的特性,一个网络输入节点,对应 ...

  8. 【背景建模】PbModel

    PbModel是基于概率模型的背景差分算法,其基本思想是像素点会因光照变化.运动物体经过产生多种颜色值,但是一段时间内,像素点处于静止状态的时间会比处于运动状态的时间长.因而一段时间内,像素点某个颜色 ...

  9. 【背景建模】VIBE

    ViBe是一种像素级的背景建模.前景检测算法,该算法主要不同之处是背景模型的更新策略,随机选择需要替换的像素的样本,随机选择邻域像素进行更新.在无法确定像素变化的模型时,随机的更新策略,在一定程度上可 ...

随机推荐

  1. DNS服务架设 redhat linux

    安装dns服务和管理工具 yum install bind   bind-chroot bind-utils -y 服务名为named 在没有启动服务之前服务的主配置文件在/etc/named.con ...

  2. Java 语言的 XPath API

    如果要告诉别人买一加仑牛奶,您会怎么说?"请去买一加仑牛奶回来" 还是 "从前门出去,向左转,走三个街区向右转,再走半个街区向右转进入商店.走向四号通道,沿通道走五米向左 ...

  3. 批量安装XP补丁的命令

    方法一: 新建一个bat文件,把这个文件和所有补丁文件放在同一个目录下,双击运行. BAT代码如下 @echo offfor %%i in (*.exe) do %%i /passive /nores ...

  4. java 中递归的实现 以及利用递归方法实现汉诺塔

    今天说下java语言中比较常见的一种方法,递归方法. 递归的定义 简单来说递归的方法就是"自己调用自己",通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度.对于 ...

  5. 寻找中位数v1.0

    题目内容: 编写一个函数返回三个整数中的中间数.函数原型为: int mid(int a, int b, int c); 函数功能是返回a,b,c三数中大小位于中间的那个数. 输入格式: " ...

  6. bower工具的简单使用

    基于NodeJS的一个静态资源管理工具,由twitter公司开发维,解决大型网站中静态资源的依赖问题. 1.依赖NodeJS环境和git工具. 2.npm install -g bower安装bowe ...

  7. ensp实战之防火墙安全转发策略

    本次实验用防火墙是USG6000V,拓扑图如下: 步骤一: 按上面配好PC1.2.3以及WWW服务器的IP地址.子网掩码以及网关: 步骤二: 进入防火墙的CLI命令模式下,按一下命令配置: 配置各个接 ...

  8. android 进程和线程管理

    进程和线程的概念: 进程:程序的运行实例. 线程:cpu调度基本单位. Activity启动的时候,启动一个主线程,两个binder线程. 主线程实如何产生的?ZygoteInit启动,经由一系列调用 ...

  9. ActionBar之style出现Cannot resolve symbol 'Theme' 错误

    今天 2014/03/08 00:49 刚刚升级 android studio 到了 0.5.0 版本,修复了许多 bug,包含当前这个问题,之前一直困扰我很久,莫名奇妙的提示主题样式找不到,无法解析 ...

  10. ACdream 1726 A Math game

    深搜.不过有一个强大的剪枝.就是假设之后的全部用上都不能达到H,则return. if (A[n]-A[x-1]+summ< H) return; //A[n]表示前nx项和 #include& ...