




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
OpenCV混合高斯模型函数注释说明一、 cvaux.h#define CV_BGFG_MOG_MAX_NGAUSSIANS 500/高斯背景检测算法的默认参数设置#define CV_BGFG_MOG_BACKGROUND_THRESHOLD 0.7 /高斯分布权重之和阈值#define CV_BGFG_MOG_STD_THRESHOLD 2.5 /=2.5(99%)#define CV_BGFG_MOG_WINDOW_SIZE 200 /学习率=1/win_size#define CV_BGFG_MOG_NGAUSSIANS 5 /k=5个混合高斯模型#define CV_BGFG_MOG_WEIGHT_INIT 0.05 /初始权重#define CV_BGFG_MOG_SIGMA_INIT 30 /初始标准差#define CV_BGFG_MOG_MINAREA 15.f /?#define CV_BGFG_MOG_NCOLORS 3 /颜色通道数/* CV_BG_STAT_MODEL_FIELDS()的宏定义*/ #define CV_BG_STAT_MODEL_FIELDS() int type; /type of BG model CvReleaseBGStatModel release; / CvUpdateBGStatModel update; IplImage* background; /*8UC3 reference background image*/ IplImage* foreground; /*8UC1 foreground image*/ IplImage* layers; /*8UC3 reference background image, can be null */ 8UC3参考背景图片,可以是空的 int layer_count; /* can be zero */ CvMemStorage* storage; /*storage for foreground_regions?/ 储存前景区域 CvSeq* foreground_regions /*foreground object contours*/前景物体轮廓/*高斯背景模型参数结构体*/typedef struct CvGaussBGStatModelParams int win_size; /等于 1/alpha int n_gauss; /高斯模型的个数 double bg_threshold, std_threshold, minArea;/ bg_threshold:高斯分布权重之和阈值、std_threshold:2.5、minArea:? double weight_init, variance_init;/权重和方差CvGaussBGStatModelParams;/*高斯分布模型结构体*/typedef struct CvGaussBGValues int match_sum; double weight; double varianceCV_BGFG_MOG_NCOLORS; double meanCV_BGFG_MOG_NCOLORS;CvGaussBGValues;typedef struct CvGaussBGPoint CvGaussBGValues* g_values;CvGaussBGPoint;/*高斯背景模型结构体*/typedef struct CvGaussBGModel CV_BG_STAT_MODEL_FIELDS(); CvGaussBGStatModelParams params; CvGaussBGPoint* g_point; int countFrames;CvGaussBGModel;二、 cvbgfg_gaussmix.cpp/ cvCreateGaussianBGModel/功能:高斯背景模型变量bg_model初始化赋值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;/学习率=1/200=0.005 params.bg_threshold = CV_BGFG_MOG_BACKGROUND_THRESHOLD;/判断是否为背景点的阈值0.7 params.std_threshold = CV_BGFG_MOG_STD_THRESHOLD;/标准阈值2.5 params.weight_init = CV_BGFG_MOG_WEIGHT_INIT;/权重值0.05 params.variance_init = CV_BGFG_MOG_SIGMA_INIT*CV_BGFG_MOG_SIGMA_INIT; /方差30*30 params.minArea = CV_BGFG_MOG_MINAREA;/? params.n_gauss = CV_BGFG_MOG_NGAUSSIANS;/高斯模型个数 else params = *parameters; 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) );/申请内存空间 memset( bg_model, 0, sizeof(*bg_model) ); bg_model-type = CV_BG_MODEL_MOG;/ CV_BG_MODEL_MOG高斯背景模型 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);/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_point0.g_values = (CvGaussBGValues*)cvAlloc( sizeof(CvGaussBGValues)*params.n_gauss* (first_frame-width*first_frame-height + 128);/128?/n:表示像素点的索引值/p:表示当前像素对应颜色通道的首地址/ g_point:对应像素点、g_values:对应高斯模型、variance和 mean:对应颜色通道 for( i = 0, p = 0, n = 0; i height; i+ )/行 for( j = 0; j width; j+, n+ )/列 bg_model-g_pointn.g_values = bg_model-g_point0.g_values + n*params.n_gauss;/每个像素点的第一个高斯模型的地址(每个像素对应n_gauss个高斯分布模型) /初始化第一个高斯分布模型的参数 bg_model-g_pointn.g_values0.weight = 1; /取较大权重,此处设置为1 bg_model-g_pointn.g_values0.match_sum = 1;/高斯函数被匹配的次数(?) for( m = 0; m nChannels; m+) /对各颜色通道的方差和均值赋值 bg_model-g_pointn.g_values0.variancem = var_init;/初始化较大的方差 bg_model-g_pointn.g_values0.meanm = (unsigned char)first_frame-imageDatap + m;/赋值为当前像素值 /初始化剩下的高斯分布模型的参数 for( k = 1; k g_pointn.g_valuesk.weight = 0;/各高斯分布取相等且较小权重值,此处取0 bg_model-g_pointn.g_valuesk.match_sum = 0; for( m = 0; m nChannels; m+) bg_model-g_pointn.g_valuesk.variancem = var_init; /初始化较大的方差 bg_model-g_pointn.g_valuesk.meanm = 0; /赋值0 p += first_frame-nChannels; bg_model-countFrames = 0; _END_; if( cvGetErrStatus() release ) bg_model-release( &base_ptr ); else cvFree( &bg_model ); bg_model = 0; return (CvBGStatModel*)bg_model;/ icvUpdateGaussianBGModel /功能:对高斯背景模型变量bg_model进行更新static int CV_CDECL icvUpdateGaussianBGModel( IplImage* curr_frame, CvGaussBGModel* bg_model ) int i, j, k; int region_count = 0; CvSeq *first_seq = NULL, *prev_seq = NULL, *seq = NULL; bg_model-countFrames+; for( i = 0; i height; i+ )/行 for( j = 0; j width; j+ )/列 int matchCV_BGFG_MOG_MAX_NGAUSSIANS; double sort_keyCV_BGFG_MOG_MAX_NGAUSSIANS; const int nChannels = curr_frame-nChannels;/通道数目 const int n = i*curr_frame-width+j;/像素索引值 const int p = n*curr_frame-nChannels;/像素点颜色通道的首地址 / A few short cuts CvGaussBGPoint* g_point = &bg_model-g_pointn; const CvGaussBGStatModelParams bg_model_params = bg_model-params; double pixel4; int no_match; for( k = 0; k imageDatap+k; no_match = icvMatchTest( pixel, nChannels, match, g_point, &bg_model_params ); /判断高斯背景模型更新帧数是否达到设置值win_size(?)(初始更新阶段和一般更新阶段在更新处理过程中是不同的,其中定义初始更新阶段为帧数小于win_size) if( bg_model-countFrames = bg_model-params.win_size )/一般更新阶段 icvUpdateFullWindow( pixel, nChannels, match, g_point, &bg_model-params ); if( no_match = -1) icvUpdateFullNoMatch( curr_frame, p, match, g_point, &bg_model_params ); else icvUpdatePartialWindow( pixel, nChannels, match, g_point, &bg_model_params ); if( no_match = -1) icvUpdatePartialNoMatch( pixel, nChannels, match, g_point, &bg_model_params ); icvGetSortKey( nChannels, sort_key, g_point, &bg_model_params ); icvInsertionSortGaussians( g_point, sort_key, (CvGaussBGStatModelParams *)&bg_model_params ); icvBackgroundTest( nChannels, n, p, match, bg_model ); /foreground filtering /filter small regions cvClearMemStorage(bg_model-storage); /cvMorphologyEx( bg_model-foreground, bg_model-foreground, 0, 0, CV_MOP_OPEN, 1 ); /cvMorphologyEx( bg_model-foreground, bg_model-foreground, 0, 0, CV_MOP_CLOSE, 1 ); cvFindContours( bg_model-foreground, bg_model-storage, &first_seq, sizeof(CvContour), CV_RETR_LIST ); for( seq = first_seq; seq; seq = seq-h_next ) CvContour* cnt = (CvContour*)seq; if( cnt-rect.width * cnt-rect.height params.minArea ) /delete small contour prev_seq = seq-h_prev; if( prev_seq ) prev_seq-h_next = seq-h_next; if( seq-h_next ) seq-h_next-h_prev = prev_seq; else first_seq = seq-h_next; if( seq-h_next ) seq-h_next-h_prev = NULL; else region_count+; bg_model-foreground_regions = first_seq; cvZero(bg_model-foreground); cvDrawContours(bg_model-foreground, first_seq, CV_RGB(0, 0, 255), CV_RGB(0, 0, 255), 10, -1); return region_count;/ icvMatchTest /功能:将当前像素与个高斯分布进行匹配判断,如果匹配成功,则返回相应高斯分布的索引值static int icvMatchTest( double* src_pixel, int nChannels, int* match, const CvGaussBGPoint* g_point, const CvGaussBGStatModelParams *bg_model_params ) int k; int matchPosition=-1; for ( k = 0; k n_gauss; k+) matchk=0;/高斯分布匹配标识数组初始化置0 for ( k = 0; k n_gauss; k+) double sum_d2 = 0.0; double var_threshold = 0.0; for(int m = 0; m g_valuesk.meanm- src_pixelm; sum_d2 += (d*d); var_threshold += g_point-g_valuesk.variancem; /difference STD_LIMIT*STD_LIMIT or difference*2 std_threshold*bg_model_params-std_threshold*var_threshold;/匹配方程为:或者 if(sum_d2 win_size);/学习率for(int k = 0; k n_gauss; k+) /若matchk=0,则权重的更新公式: /若matchk=0,则权重的更新公式: g_point-g_valuesk.weight = g_point-g_valuesk.weight + (learning_rate_weight*(double)matchk -g_point-g_valuesk.weight); if(matchk)/更新匹配的高斯分布的参数 /参数学习率double learning_rate_gaussian = (double)matchk/(g_point-g_valuesk.weight*(double)bg_model_params-win_size); for(int m = 0; m g_valuesk.meanm; /均值更新公式为: g_point-g_valuesk.meanm = g_point-g_valuesk.meanm +(learning_rate_gaussian * tmpDiff); /方差更新公式为: g_point-g_valuesk.variancem = g_point-g_valuesk.variancem+ (learning_rate_gaussian*(tmpDiff*tmpDiff) - g_point-g_valuesk.variancem); / icvUpdateFullNoMatch /功能:当前像素点与所有高斯分布都不匹配时,需要将比值最小的高斯分布替换为新的高斯分布(权值小、方差大),其余的高斯分布保持原来的均值和方差,但权值需要减小。static void icvUpdateFullNoMatch( IplImage* gm_image, int p, int* match, CvGaussBGPoint* g_point, const CvGaussBGStatModelParams *bg_model_params) int k, m; double alpha; int match_sum_total = 0; /new value of last one g_point-g_valuesbg_model_params-n_gauss - 1.match_sum = 1;/将新的高斯分布的match_sum置为1 /get sum of all but last value of match_sum for( k = 0; k n_gauss ; k+ ) match_sum_total += g_point-g_valuesk.match_sum; /设置新的高斯分布的参数 g_point-g_valuesbg_model_params-n_gauss - 1.weight = 1./(double)match_sum_total; /给新的高斯分布设置一个较小的权值,即1.0/ match_sum_total for( m = 0; m nChannels ; m+ ) / first pass mean is image value g_point-g_valuesbg_model_params-n_gauss - 1.variancem = bg_model_params-variance_init;/初始化一个较大的方差 g_point-g_valuesbg_model_params-n_gauss - 1.meanm = (unsigned char)gm_image-imageDatap + m; /将当前像素值作为均值 /更新其余高斯分布的参数 alpha = 1.0 - (1.0/bg_model_params-win_size); for( k = 0; k n_gauss - 1; k+ ) /更新权值的公式为: g_point-g_valuesk.weight *= alpha; if( matchk )/对于匹配的高斯分布,权值更新公式为 g_point-g_valuesk
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 兰州外语职业学院《语言学概论》2023-2024学年第二学期期末试卷
- 新疆石河子职业技术学院《运动处方》2023-2024学年第二学期期末试卷
- 石家庄人民医学高等专科学校《材料专业英语》2023-2024学年第一学期期末试卷
- 泰山学院《运动辅项(一)》2023-2024学年第二学期期末试卷
- 脑梗取栓护理查房
- 无创溶斑培训大纲
- 2025合同履行争议中的法律问题
- 2025金融衍生品与配套人民币借款合同书
- 物业管理条例培训
- 2025年普法知识竞赛题库及答案(共70题)
- 激光雷达笔试试题及答案
- 2025届高三湖北省十一校第二次联考英语试卷(含答案详解)
- 信息技术与小学教育教学融合
- 产品设计研发费用统计表
- 2025届广东省深圳市高三年级第一次调研考试历史试题
- 2024年出版专业资格考试《基础知识》(中级)真题及答案
- 2023数据中心节能改造实践案例
- 政治-湖南省长郡二十校联盟2025届新高考教学教研联盟高三第一次联考(长郡二十校一联)试题和答案
- 骨干教师培训与示范课实施计划
- 《建筑工程施工索赔与应对策略》课件
- 项目进度管理与监控的工作计划
评论
0/150
提交评论