基于codebook背景建模的运动目标检测

本文介绍了基于codebook背景建模的运动目标检测方法,它通过学习和更新编码本来区分背景与前景。codebook利用编码元的box和学习区域对像素进行分类,通过清除不常使用的编码元排除干扰。尽管codebook模型在处理复杂运动和光照变化方面表现出色,但对于全局光照变化的适应性较弱,可能需要结合多种条件的codebook模型来改善。
摘要由CSDN通过智能技术生成

帧差法可以用来检测运动目标,简单的背景模型建模是以图像序列均值以及差序列均值为基础的,优点是比较简单,缺点以均值为基础的背景模型无法涵括亮度跳度较大的周期背景(例如摇曳的树、转动的风扇、摆动窗帘等等)。

codebook用来描述一个像素位置的信息,是多个编码元(一个编码本),每个编码元主要包含一个box和两个学习区域。如下图可以理解为一个像素位置的两个编码元(编码元1相比编码元2来说对应更高的灰度区域)。

编码本示意图


codebook同样需要一定背景图像序列学习,学习过程:

任意一个像素位置由一个编码本组成,一个编码本由多个编码元组成。每个编码元包含一个box,两块学习区域。当一个像素点灰度值在已有的任何一个box规定的范围内,我们直接判断其属于该编码元,跳过即可;当其不在box范围内,但在学习区域内,我们认为其属于该编码元,但需要进行box区域范围的更新(算是一种学习);若其同样不在学习区域内,则建立新的编码元。

codebook去除干扰:

每个编码元内包含一个t参数,是距离上次被查到属于该编码元时所过去的时间,用于排除不常使用的编码元。例如,可以设置一个时间阈值t=20帧,则将删除过去20帧内没有被访问到的编码元。

codebook前景检测:

与建立编码本过程类似,只是此时不再考虑学习区域,一个像素通过判断其是否属于该位置点的编码元,如果全都不属于,则认为是前景。

codebook主要的前景分割参数:

minMod[i]   = 10;   // 用于背景差分函数中
maxMod[i]   = 10;   // 调整其值以达到最好的分割

其含义为每个box的波动区域,值越大,被检测的像素则更可能在box中,即背景。
因此,如果原图噪声较大,可以设置大一些,去噪噪声,但也会导致一些目标信息的丢失,因此实际使用时需要不断实验得到最好的值。


使用CODEBOOK背景模型过程:
(1)使用函数update_codebook()在几秒或几分钟的时间内训练一个基本的背景模型。
(2)调用函数clear_stale_entries()清除stale索引。
(3)调整阈值minmod和maxmod对已知前景达到最好分割。
(4)保持一个更高级的场景模型
(5)通过函数background_diff()使用训练好的模型将前景从背景中分割出来。
(6)定期更新学习的背景像素。
(7)在一个频率较慢的情况下,用函数clear_stale_entries()定期清理stale的codebook索引


以下为随机截取的几帧实验图像
女人和她的影子

男人和他的影子

两个人和影子

单人


可以看出,codebook背景模型由于更加复杂,对运动目标的检测效果还是不错的,同时训练数据速度也比较快。但它不能很好处理不同模式的光(如早晨、中午和傍晚的阳光,室内开关灯等),因为某一场景会因长时间没被访问而删除,这种全局变化的类型可以考虑用几种不同条件下的codebook模型处理。

#include <cv.h>         
#include <highgui.h>
#include <cxcore.h>

#define CHANNELS 3      
// 设置处理的图像通道数,要求小于等于图像本身的通道数

///////////////////////////////////////////////////////////////////////////
// 下面为码本码元的数据结构
// 处理图像时每个像素对应一个码本,每个码本中可有若干个码元
// 当涉及一个新领域,通常会遇到一些奇怪的名词,不要被这些名词吓坏,其实思路都是简单的
typedef struct ce {
    uchar   learnHigh[CHANNELS];    // High side threshold for learning
    // 此码元各通道的阀值上限(学习界限)
    uchar   learnLow[CHANNELS];     // Low side threshold for learning
    // 此码元各通道的阀值下限
    // 学习过程中如果一个新像素各通道值x[i],均有 learnLow[i]<=x[i]<=learnHigh[i],则该像素可合并于此码元
    uchar   max[CHANNELS];          // High side of box boundary
    // 属于此码元的像素中各通道的最大值
    uchar   min[CHANNELS];          // Low side of box boundary
    // 属于此码元的像素中各通道的最小值
    int     t_last_update;          // This is book keeping to allow us to kill stale entries
    // 此码元最后一次更新的时间,每一帧为一个单位时间,用于计算stale
    int     stale;                  // max negative run (biggest period of inactivity)
    // 此码元最长不更新时间,用于删除规定时间不更新的码元,精简码本
} code_element;                     // 码元的数据结构

typedef struct code_book {
    code_element    **cb;
    // 码元的二维指针,理解为指向码元指针数组的指针,使得添加码元时不需要来回复制码元,只需要简单的指针赋值即可
    int             numEntries;
    // 此码本中码元的数目
    int             t;              // count every access
    // 此码本现在的时间,一帧为一个时间单位
} codeBook;                         // 码本的数据结构


///////////////////////////////////////////////////////////////////////////////////
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值