运动目标检测 之 GMM背景模型算法

综述

单高斯背景建模是一种基于像素样本统计信息的背景表示方法,它是根据视频中的每个像素在时域上的概率统计信息(均值/方差)来构建各个像素的颜色分布模型,依次来达到背景建模的目的。背景建模完成后,使用统计差分进行目标像素判断以达到对前景目标的检测,同时用目标像素不断更新背景模型以实现对动态背景的建模拟合。

混合高斯背景模型是有限个单高斯分布的加权和,它能描述像素的多峰状态,适用于对光照渐变、树木摇摆等复杂背景进行准确建模。所谓多峰状态就是在同一时间段内,由于场景的复杂性某个像素点存在多个背景状态,比如树木摇摆的某个像素点,在树枝覆盖了这个像素点时它的像素点值(R:35,G:45,B:65),在下帧图像中树枝由于风吹没有覆盖这个像素点时它的值为(R:135,G:200,B:35),对这个像素来说它有这两种背景状态,在视频中很多帧图像的时序上来说,这个像素点不停的出现这两种状态,就呈现了一个多峰的背景分布模型。

高斯背景模型中,认为像素之间的颜色信息互不相关,对各像素点的处理都是相互独立的。对于视频图像中的每一个像素点,其值在序列图像中的变化可看作是不断产生像素值的随机过程,即用高斯分布来描述每个像素点的颜色呈现规律(多峰/单峰)。

原理

在混合高斯背景模型维护中,场景中的一个像素值的混合高斯模型我们假设它有K个高斯分布组成,那么在图像中像素j在时刻t取值为 的概率为:

其中表示t时刻像素j的混合高斯模型中第i个高斯分布的权重,满足:
其中
表示 第i个高斯成分的均值
是协方差:,其中是标准差,I是单位矩阵
为高斯概率密度函数:

算法逻辑

1、初始化:取视频第一帧图像中每个像素的值来对各自混合高斯模型中K个单高斯分布的均值赋值,对K个单高斯分布的方差赋值为,对这K个高斯分布权重初始化为

2、在视频流中每帧新图像每个像素值与当前像素的K个单高斯模型逐个进行比较,判断是否与高斯模型的均值的偏差在一定范围内

其中,是标准差的倍数,表示前一时刻,在视频流里就是前一帧

3、如果符合上述公式则这个像素值符合这个单高斯背景要求是某个K个模型中某个单高斯背景点,否则是这个单高斯的前景点

4、如果像素点与某一高斯模式匹配,那么这个高斯模式假设是第i个模式的参数更新如下:


5、如果第二步中没有任何模式匹配,则这个像素对应的K个高斯模式中的最小的被替换,替换的模式的均值为,方差为,权重为

6、跳出模式的遍历循环后,各个模式的权值按如下公式更新,

其中,学习速率,对于匹配的模式不匹配的模式,然后对各模式权重归一化

7、各个模式根据的值降序排列,权重大,标准差小的模式排在前面

8、排序完成后,取前个高斯模型作为整个混合高斯模型的背景分布,要求就是,这个高斯的权重累加起来的和大于一定阈值:

其中:T是人为设定的阈值,k是表示几个高斯模型。

9、结合第3步与第8步,将第3步判断中,如果一个像素相对于第8步中的k个高斯分布来说都是前景点的话,就认为这个像素点是目标检测的目标的一个像素点,将所有这样的像素点组合起来形成前景目标,实现视频目标检测。

算法源码

.h文件

#ifndef OBJDET_INNERHEAD_H
#define OBJDET_INNERHEAD_H

#ifdef __cplusplus
extern "C"{
#endif

#include "ObjDet_Interface.h"

//#define OD_EXE_DSP

#ifdef OD_EXE_DSP

#else
#define OD_VIBE
#endif

#define IN 
#define OUT
#define INOUT


#define OBJ_WH_MIN    32  /*目标宽高最低值*/
#define OBJ_WH_MAX    128 /*目标宽高最大值*/

#define ALIGN_1(a) ((0 == a % 8) ? (a) : (((a + 8)>>3)<<3))
#define ALIGN_2(a) ((0 == a % 16) ? (a) : (((a + 16)>>4)<<4))
#define ALIGN_3(a) ((0 == a % 32) ? (a) : (((a + 32)>>5)<<5))

#define FLTMAX(a, b) ((a > b) ? (a) : (b))
#define FLTMIN(a, b) ((a < b) ? (a) : (b))
#define MEDINCHAR(x) (((x) < 0 ? 0 : ((x) > 255 ? 255 : (x))))

#define SWAP_VALUE(A, B) {int tmpSwap;tmpSwap=A; A=B; B=tmpSwap;}

#define DIFABS(a, b) ((a > b) ? (a - b) : (0))


typedef unsigned char          U8;   
typedef unsigned short         U16; 
typedef unsigned int           U32;
#ifdef CHIP_DM6467
typedef unsigned long long     U64;
#else
typedef unsigned __int64       U64;
#endif

typedef signed char            S8;
typedef signed short           S16;
typedef signed int             S32;
#ifdef CHIP_DM6467
typedef signed long long       S64;
#else
typedef signed __int64         S64;
#endif

typedef float                  FL;
typedef double                 DB;
typedef void                   VD;

typedef unsigned char *         PU8;   
typedef unsigned short *        PU16; 
typedef unsigned int *          PU32;
#ifdef CHIP_DM6467
typedef unsigned long long *    PU64;
#else
typedef unsigned __int64   *    PU64;
#endif

typedef signed char *           PS8;
typedef signed short *          PS16;
typedef signed int *            PS32;
#ifdef CHIP_DM6467
typedef signed long long *      PS64;
#else
typedef signed __int64   *      PS64;
#endif

typedef float *                 PFL;
typedef double *                PDB;
typedef void *                  PVD;


/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^函数结构体定义^^^^^^^^^^^^^^^^^^^^^^*/



/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv函数结构体定义vvvvvvvvvvvvvvvvvvvvvv*/
#ifdef __cplusplus
}
#endif
#endif

.c文件

#ifdef __cplusplus
extern "C"{
#endif

#include "ObjDet_GmmHead.h"


/*****************************************************************************
 函 数 名  : OD_GmmDestroy
 功能描述  : XXXX
 输入参数  : INOUT void **pWorkHandl  
 输出参数  : 无
 返 回 值  : 
 调用函数  : 
 被调函数  : 

 修改历史      :
  1.日    期   : 2015223日
    作    者   : TL_ImgFIlter
    修改内容   : 新生成函数

*****************************************************************************/
S32 OD_GmmDestroy(INOUT void **pWorkHandl)
{
    U8 ucModePtrIdx = 0;

    GMM_InnerInfoS *pstGmmInnerInfo = NULL;

    if
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GMM(高斯混合模型)是一种用于图像分割和目标检测的统计模型。在MATLAB中,可以使用Image Processing Toolbox中的函数来实现GMM运动目标检测。 以下是实现GMM运动目标检测的步骤: 1. 读取视频帧 使用VideoReader函数读取视频帧,并将其转换为灰度图像。 ``` v = VideoReader('video.avi'); while hasFrame(v) frame = readFrame(v); grayFrame = rgb2gray(frame); % 进行后续处理 end ``` 2. 初始化GMM模型 使用vision.ForegroundDetector函数初始化GMM模型,并设置相关参数,如模型中混合成分的数量、背景模型更新速度等。 ``` gmm = vision.ForegroundDetector('NumGaussians', 3, 'NumTrainingFrames', 50, 'MinimumBackgroundRatio', 0.7); ``` 3. 对每一帧进行前景检测 使用step函数对每一帧进行前景检测,并得到二值化的前景掩码。 ``` fgMask = step(gmm, grayFrame); ``` 4. 对前景掩码进行形态学操作 使用imopen和imclose函数对前景掩码进行形态学开和闭操作,以去除噪声和填补空洞。 ``` se = strel('disk', 3); fgMask = imopen(fgMask, se); fgMask = imclose(fgMask, se); ``` 5. 提取运动目标 使用regionprops函数提取连通区域,并计算每个区域的面积和重心。可以根据面积和重心的大小来筛选运动目标。 ``` stats = regionprops(fgMask, 'Area', 'Centroid'); for i = 1:length(stats) if stats(i).Area > 100 && stats(i).Centroid(2) < 200 % 提取运动目标并进行后续处理 end end ``` 6. 显示结果 可以使用imshow函数将处理后的图像显示出来,或者使用VideoWriter函数将结果保存为视频文件。 ``` imshow(frame); hold on; plot(stats(i).Centroid(1), stats(i).Centroid(2), 'r*'); hold off; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值