【转自:OpenCV ——背景建模之CodeBook(1)-(2)- Mr.Easy - 博客园  http://t.cn/Ainx0SXH  http://t.cn/AinxH427

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(CB)结构,每个CodeBook结构又由多个CodeWord(CW)组成。
  CB和CW的形式如下:
  CB={CW1,CW2,…CWn,t}
  CW={lHigh,lLow,max,min,t_last,stale}
  其中n为一个CB中所包含的CW的数目,当n太小时,退化为简单背景,当n较大时可以对复杂背景进行建模;t为CB更新的次数。CW是一个6元组,其中IHigh和ILow作为更新时的学习上下界,max和min记录当前像素的最大值和最小值。上次更新的时间t_last和陈旧时间stale(记录该CW多久未被访问)用来删除很少使用的CodeWord。
假设当前训练图像I中某一像素为I(x,y),该像素的CB的更新算法如下,另外记背景阈值的增长判定阈值为Bounds:
  (1) CB的访问次数加1;
  (2) 遍历CB中的每个CW,如果存在一个CW中的IHigh,ILow满足ILow≤I(x,y)≤ IHigh,则转(4);
  (3) 创建一个新的码字CWnew加入到CB中, CWnew的max与min都赋值为I(x,y), IHigh <- I(x,y) + Bounds,ILow <- I(x,y) – Bounds,并且转(6);
  (4) 更新该码字的t_last,若当前像素值I(x,y)大于该码字的max,则max <- I(x,y),若 I(x,y)小于该码字的min,则min <- I(x,y);
  (5) 更新该码字的学习上下界,以增加背景模型对于复杂背景的适应能力,具体做法是: 若IHigh < I(x,y) + Bounds,则IHigh 增长1,若ILow > I(x,y) – Bounds,则ILow 减少1;
  (6) 更新CB中每个CW的stale。
  使用已建立好的CB进行运动目标检测的方法很简单,记判断前景的范围上下界为minMod和maxMod,对于当前待检测图像上的某一像素I(x,y),遍历它对应像素背景模型CB中的每一个码字CW,若存在一个CW,使得I(x,y) < max + maxMod并且I(x,y) > min – minMod,则I(x,y)被判断为背景,否则被判断为前景。
  在实际使用CodeBook进行运动检测时,除了要隔一定的时间对CB进行更新的同时,需要对CB进行一个时间滤波,目的是去除很少被访问到的CW,其方法是访问每个CW的stale,若stale大于一个阈值(通常设置为总更新次数的一半),移除该CW。
  综上所述,CodeBook算法检测运动目标的流程如下:
  (1) 选择一帧到多帧使用更新算法建立CodeBook背景模型;
  (2) 按上面所述方法检测前景(运动目标);
  (3) 间隔一定时间使用更新算法更新CodeBook模型,并对CodeBook进行时间滤波;
  (4) 若检测继续,转(2),否则结束。

Love is everywhere.
爱无处不在。

GitHub 加速计划 / opencv31 / opencv
77.38 K
55.71 K
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:2 个月前 )
c3747a68 Added Universal Windows Package build to CI. 6 天前
9b635da5 - 6 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐