高斯背景建模源代码在“OpenCVcvauxsrccvbgfg_gaussmix.cpp”中,它参考的文章是“An Improved Adaptive Background Mixture Model for Real-time Tracking and Shadow Detection”,但其中有些变动。下面是我添加注释的代码,其中有的没读懂,也可能有部分批注错误,请研究过的人批评指正。
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
CV_IMPL CvBGStatModel*
cvCreateGaussianBGModel( IplImage* first_frame, CvGaussBGStatModelParams* parameters )
{
CvGaussBGModel* bg_model = 0;// 高斯背景状态模型变量
CV_FUNCNAME( "cvCreateGaussianBGModel" );
__BEGIN__;
double var_init; //
CvGaussBGStatModelParams params; // 高斯背景状态模型参数变量
int i, j, k, n, m, p;
//初始化参数,如果参数为空,则进行初始化赋值
if( parameters == NULL )
{
params.win_size = CV_BGFG_MOG_WINDOW_SIZE; //初始化阶段的帧数
params.bg_threshold = CV_BGFG_MOG_BACKGROUND_THRESHOLD;//高斯背景阈值
params.std_threshold = CV_BGFG_MOG_STD_THRESHOLD;//
params.weight_init = CV_BGFG_MOG_WEIGHT_INIT; // 初始权重
params.variance_init = CV_BGFG_MOG_SIGMA_INIT*CV_BGFG_MOG_SIGMA_INIT; // 初始方差
params.minArea = CV_BGFG_MOG_MINAREA; //最小面积
params.n_gauss = CV_BGFG_MOG_NGAUSSIANS;// 高斯模型个数
}
else
{
params = *parameters; //如果parameters非空,则将其参数赋给 params
}
if( !CV_IS_IMAGE(first_frame) )//如果第一帧不是图像,报错
CV_ERROR( CV_StsBadArg, "Invalid or NULL first_frame parameter" );
CV_CALL( bg_model = (CvGaussBGModel*)cvAlloc( sizeof(*bg_model) )); //为bg_model申请内存
memset( bg_model, 0, sizeof(*bg_model) );// 初始化刚申请的内存
bg_model->type = CV_BG_MODEL_MOG; // 背景模型类型是: CV_BG_MODEL_MOG
bg_model->release = (CvReleaseBGStatModel)icvReleaseGaussianBGModel;// 释放调用icvReleaseGaussianBGModel
bg_model->update = (CvUpdateBGStatModel)icvUpdateGaussianBGModel;// 更新调用icvUpdateGaussianBGModel
bg_model->params = params; //参数为 params
//prepare storages
CV_CALL( bg_model->g_point = (CvGaussBGPoint*)cvAlloc(sizeof(CvGaussBGPoint)*
((first_frame->width*first_frame->height) + 256))); //为背景模型bg_model的高斯背景点g_point 分配内存,