高斯背景建模的学习

41 篇文章 0 订阅
21 篇文章 0 订阅

创建高斯背景模型

cvCreateGaussianBGModel( IplImage* first_frame, CvGaussBGStatModelParams* parameters )
{
//CvGaussBGModel在cvaux.h中有定义,是一个结构体
CvGaussBGModel* bg_model = 0;

CV_FUNCNAME( "cvCreateGaussianBGModel" );//在cxerror.h定义,定义cvFuncName宏变量
//cvFuncName定义为和函数名称相同cvCreateGaussianBGModel

__BEGIN__;//开始处理(是必须接在这个CV_FUNCNAME之后的)

double var_init;
CvGaussBGStatModelParams params;//定义初始化变量,在cvaux.h中定义的结构体CvGaussBGStatModelParams
int i, j, k, n, m, p;

//init parameters
if( parameters == NULL )
{
params.win_size = CV_BGFG_MOG_WINDOW_SIZE;//CV_BGFG_MOG_WINDOW_SIZE=200,和学习率的关系1/200=0.005
params.bg_threshold = CV_BGFG_MOG_BACKGROUND_THRESHOLD;//CV_BGFG_MOG_BACKGROUND_THRESHOLD=0.7(判断是否为背景点的阈值)
params.std_threshold = CV_BGFG_MOG_STD_THRESHOLD;//CV_BGFG_MOG_STD_THRESHOLD=2.5(标准阈值)
params.weight_init = CV_BGFG_MOG_WEIGHT_INIT;//CV_BGFG_MOG_WEIGHT_INIT=0.05(权值)
params.variance_init = CV_BGFG_MOG_SIGMA_INIT*CV_BGFG_MOG_SIGMA_INIT;//CV_BGFG_MOG_SIGMA_INIT=30(方差)
params.minArea = CV_BGFG_MOG_MINAREA;//CV_BGFG_MOG_MINAREA=15.f(这个不知道?)
params.n_gauss = CV_BGFG_MOG_NGAUSSIANS;//CV_BGFG_MOG_NGAUSSIANS=5(高斯模型数量)
}
else
{
params = *parameters;
}
//CV_IS_IMAGE在cxtypes.h中定义,在这里估计是判断是否有读入图象帧
//CV_StsBadArg=-5,代表函数有问题,或者输入的参数有问题
if( !CV_IS_IMAGE(first_frame) )
CV_ERROR( CV_StsBadArg, "Invalid or NULL first_frame parameter" );

//CV_CALL在cxerror.h中有定义,这里用来确认一下调用是否正确
CV_CALL( bg_model = (CvGaussBGModel*)cvAlloc( sizeof(*bg_model) ));
memset( bg_model, 0, sizeof(*bg_model) );
bg_model->type = CV_BG_MODEL_MOG;//这个在cvGaussBGModel中定义的CV_BG_STAT_MODEL_FIELDS()函数中都有,存在type,release,update,foreground,background等
bg_model->release = (CvReleaseBGStatModel)icvReleaseGaussianBGModel;
bg_model->update = (CvUpdateBGStatModel)icvUpdateGaussianBGModel;

bg_model->params = params;

//分配存储空间
CV_CALL( bg_model->g_point = (CvGaussBGPoint*)cvAlloc(sizeof(CvGaussBGPoint)*
((first_frame->width*first_frame->height) + 256)));//这个是参与的点数,以及存放这些点需要的空间
CV_CALL( bg_model->background = cvCreateImage(cvSize(first_frame->width,
first_frame->height), IPL_DEPTH_8U, first_frame->nChannels));//给背景分配存储空间
CV_CALL( bg_model->foreground = cvCreateImage(cvSize(first_frame->width,
first_frame->height), IPL_DEPTH_8U, 1));//给前景分配存储空间

CV_CALL( bg_model->storage = cvCreateMemStorage());//分配存储空间

//初始化

var_init = 2 * params.std_threshold * params.std_threshold;
CV_CALL( bg_model->g_point[0].g_values =
(CvGaussBGValues*)cvAlloc( sizeof(CvGaussBGValues)*params.n_gauss*
(first_frame->width*first_frame->height + 128)));//这个是给g_value分配足够的存储空间

//程序说明
//g_values[0],g_values[1],g_values[2]存放3个高斯混合模型的变量
//g_values[].weight(权重) g_values[].mean[](均值) g_values[].variance[](方差)
//具体安排是每一个象素点都有3个模型,
//然后每一个象素点的三个模型
//模型0的权重为1,方差为2倍的标准差的平方,均值为当前象素点的值
//模型1的权重为0,方差为2倍的标准差的平方,均值为0
//模型2的权重为0,方差为2倍的标准差的平方,均值为0
//g_point指的是参加高斯背景建模的象素点的个数
for( i = 0, p = 0, n = 0; i < first_frame->height; i++ )
{
for( j = 0; j < first_frame->width; j++, n++ )
{
bg_model->g_point[n].g_values =
bg_model->g_point[0].g_values + n*params.n_gauss;
bg_model->g_point[n].g_values[0].weight = 1;//the first value seen has weight one
bg_model->g_point[n].g_values[0].match_sum = 1;
for( m = 0; m < first_frame->nChannels; m++)
{
bg_model->g_point[n].g_values[0].variance[m] = var_init;
bg_model->g_point[n].g_values[0].mean[m] = (unsigned char)first_frame->imageData[p + m];
}
for( k = 1; k < params.n_gauss; k++)
{
bg_model->g_point[n].g_values[k].weight = 0;
bg_model->g_point[n].g_values[k].match_sum = 0;
for( m = 0; m < first_frame->nChannels; m++){
bg_model->g_point[n].g_values[k].variance[m] = var_init;
bg_model->g_point[n].g_values[k].mean[m] = 0;
}
}
p += first_frame->nChannels;
}
}

bg_model->countFrames = 0;

__END__;

if( cvGetErrStatus() < 0 )
{
CvBGStatModel* base_ptr = (CvBGStatModel*)bg_model;

if( bg_model && bg_model->release )
bg_model->release( &base_ptr );
else
cvFree( &bg_model );
bg_model = 0;
}

return (CvBGStatModel*)bg_model;
}

这整个函数就是对结构体cvGaussBGModel里面的参数:CV_BG_STAT_MODEL_FIELDS(),params,g_point,countFrames赋值,实际上也是可以把其复制过来,自己修改初时的参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自适应背景建模和混合高斯背景建模都是常用的背景建模算法,它们在视频监控、动态目标检测等领域都有广泛的应用。这里我们将介绍一种将自适应背景建模和混合高斯背景建模进行融合的方法。 自适应背景建模算法是一种基于像素的背景建模方法,它使用滑动窗口对目标像素周围的像素进行统计,从而得到当前像素的背景值。这种方法能够适应场景的变化,但是对于复杂场景中的目标检测效果不佳。 混合高斯背景建模算法则是一种基于概率的背景建模方法,它使用高斯分布对像素进行建模,每个像素都有多个高斯分布来表示不同的背景状态。这种方法对于复杂场景中的目标检测效果较好,但是对于场景变化较大的情况下,需要重新学习背景模型,运算量较大。 因此,我们可以将自适应背景建模和混合高斯背景建模进行融合,以充分利用它们各自的优点。具体地,我们可以先使用自适应背景建模算法进行背景建模,并得到一个初步的背景模型。然后,将这个背景模型作为初始化的参数,使用混合高斯背景建模算法对目标进行检测和分割。 通过这种方法,我们可以在一定程度上减少场景变化对背景建模的影响,同时也能够有效地检测和分割目标。但是,这种方法需要更多的计算资源和更复杂的算法实现,因此在实际应用中需要根据具体情况进行选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值