尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MATLAB高斯背景建模与目标提取(人体检测)

MATLAB高斯背景建模与目标提取(人体检测) MATLAB实现使用高斯混合模型(GMM)进行背景建模并从视频中提取运动目标特别是人体。functiongaussian_background_modeling()% 高斯背景建模与目标提取主函数clear;clc;close all;% 参数设置video_sourcepedestrians.avi;% 视频文件路径learning_rate0.005;% 背景学习率num_gaussians3;% 每个像素的高斯分布数量bg_ratio0.7;% 背景权重比例阈值variance_threshold25;% 方差阈值min_area500;% 最小目标面积(像素)% 创建视频读取器ifexist(video_source,file)2vid_readerVideoReader(video_source);elseerror(视频文件不存在: %s,video_source);end% 获取第一帧并初始化first_framereadFrame(vid_reader);ifsize(first_frame,3)1first_framecat(3,first_frame,first_frame,first_frame);end[height,width,~]size(first_frame);% 初始化高斯模型参数weightsones(height,width,num_gaussians)/num_gaussians;% 权重meansrepmat(reshape(first_frame,height,width,1,3),[1,1,num_gaussians,1]);% 均值variancesones(height,width,num_gaussians)*15;% 方差background_maskfalse(height,width);% 背景掩码% 创建结果展示窗口figfigure(Name,高斯背景建模与目标提取,NumberTitle,off,...Position,[100,100,1200,600],MenuBar,none);% 主处理循环frame_count0;whilehasFrame(vid_reader)framereadFrame(vid_reader);frame_countframe_count1;ifisempty(frame),break;endifsize(frame,3)1framecat(3,frame,frame,frame);end% 转换为双精度浮点型frame_doubleim2double(frame);% 更新高斯模型[background_mask,foreground_mask]update_gmm_model(...frame_double,weights,means,variances,learning_rate,...bg_ratio,variance_threshold,num_gaussians);% 提取运动目标人体detected_objectsextract_moving_objects(foreground_mask,min_area);% 可视化结果visualize_results(fig,frame,background_mask,foreground_mask,detected_objects,frame_count);% 控制处理速度pause(0.02);end% 释放视频资源release(vid_reader);endfunction[bg_mask,fg_mask]update_gmm_model(frame,weights,means,variances,lr,ratio_thresh,var_thresh,K)% 更新高斯混合模型并返回背景/前景掩码[h,w,~]size(frame);fg_maskfalse(h,w);bg_maskfalse(h,w);% 遍历每个像素fori1:hforj1:w pixelsqueeze(frame(i,j,:));% 当前像素值 (1x3)pixel_vecreshape(pixel,1,1,3);% 转换为1x1x3% 获取当前像素的模型参数w_ijsqueeze(weights(i,j,:));% 权重 (1xK)mu_ijsqueeze(means(i,j,:,:));% 均值 (Kx3)var_ijsqueeze(variances(i,j,:));% 方差 (1xK)% 计算马氏距离简化版欧氏距离distancessum((mu_ij-pixel_vec).^2,3);% Kx1向量% 找到最佳匹配的高斯分布[min_dist,match_idx]min(distances);% 更新匹配的高斯分布ifmin_distvar_thresh(multiindex(match_idx))% 阈值设为方差% 更新权重、均值和方差w_ij(match_idx)(1-lr)*w_ij(match_idx)lr;mu_ij(match_idx,:)(1-lr)*mu_ij(match_idx,:)lr*pixel;var_ij(match_idx)(1-lr)*var_ij(match_idx)lr*min_dist;% 更新其他高斯分布权重w_ij(1-lr)*w_ij;w_ij(match_idx)w_ij(match_idx)lr;else% 未匹配任何分布替换最不匹配的分布[~,worst_idx]min(w_ij);w_ij(worst_idx)lr;mu_ij(worst_idx,:)pixel;var_ij(worst_idx)var_thresh;% 更新其他高斯分布权重w_ij(1-lr)*w_ij;w_ij(worst_idx)w_ij(worst_idx)lr;end% 归一化权重w_ijw_ij/sum(w_ij);% 确定背景模型[sorted_w,sort_idx]sort(w_ij,descend);cum_sumcumsum(sorted_w);bg_componentscum_sumratio_thresh;num_bgsum(bg_components);% 创建背景掩码ifany(distances(sort_idx(1:num_bg))2.5*sqrt(var_ij(sort_idx(1:num_bg))))bg_mask(i,j)true;elsefg_mask(i,j)true;end% 保存更新后的参数weights(i,j,:)w_ij;means(i,j,:,:)mu_ij;variances(i,j,:)var_ij;endendendfunctionobjectsextract_moving_objects(fg_mask,min_area)% 从前景掩码中提取运动目标% 形态学操作去除噪声sestrel(disk,3);cleaned_maskimopen(fg_mask,se);cleaned_maskimclose(cleaned_mask,se);% 填充小孔filled_maskimfill(cleaned_mask,holes);% 标记连通区域[labeled,num_objects]bwlabel(filled_mask,8);statsregionprops(labeled,Area,BoundingBox,Centroid);% 过滤小区域valid_objects[];fork1:num_objectsifstats(k).Areamin_area valid_objects[valid_objects;k];endend% 创建目标结构objectsstruct(BoundingBox,{},Centroid,{},Area,{});foridx1:length(valid_objects)kvalid_objects(idx);objects(idx).BoundingBoxstats(k).BoundingBox;objects(idx).Centroidstats(k).Centroid;objects(idx).Areastats(k).Area;endendfunctionvisualize_results(fig,frame,bg_mask,fg_mask,objects,frame_num)% 可视化结果figure(fig);clf;% 显示原始帧subplot(2,2,1);imshow(frame);title(sprintf(原始视频 (帧: %d),frame_num));% 显示背景模型subplot(2,2,2);background_imguint8(repmat(bg_mask,[1,1,3])*255);imshow(background_img);title(背景模型);% 显示前景掩码subplot(2,2,3);foreground_imguint8(repmat(fg_mask,[1,1,3])*255);imshow(foreground_img);title(前景掩码);% 显示检测结果subplot(2,2,4);result_imgframe;fork1:length(objects)bboxobjects(k).BoundingBox;centroidobjects(k).Centroid;% 绘制边界框result_imginsertShape(result_img,Rectangle,bbox,...Color,red,LineWidth,2);% 绘制质心result_imginsertMarker(result_img,centroid,o,...Color,green,Size,10);% 显示目标信息labelsprintf(目标 %d: %.0f px,k,objects(k).Area);result_imginsertText(result_img,[bbox(1),bbox(2)-20],label,...FontSize,12,BoxColor,yellow,TextColor,black);endimshow(result_img);title(sprintf(检测到 %d 个目标,length(objects)));drawnow;end% 辅助函数多索引访问functionvalmultiindex(idx)persistent values;ifisempty(values)values[15,25,35];% 不同高斯分布的方差阈值endvalvalues(min(idx,length(values)));end算法原理详解高斯混合模型(GMM)背景建模高斯混合模型假设每个像素的颜色分布可以由多个高斯分布的加权和表示其中KKK高斯分布的数量通常3-5个wi,tw_{i,t}wi,t​第iii个高斯分布在时间t的权重μi,tμ_{i,t}μi,t​第i个高斯分布的均值Σi,tΣ_{i,t}Σi,t​第iii个高斯分布的协方差矩阵背景更新过程匹配阶段对于新像素值xt找到与其最匹配的高斯分布最小Mahalanobis距离更新阶段匹配成功wi←(1−α)wiα(μi,Σi)w_i←(1−α)w_iα(μ_i,Σ_i)wi​←(1−α)wi​α(μi​,Σi​)按学习率更新匹配失败创建新分布或替换最不匹配的分布背景判定按权重排序高斯分布累积权重超过阈值T的分布被视为背景目标提取流程前景分割像素不属于背景模型则标记为前景形态学处理开运算去除小的亮点噪声闭运算填充小的孔洞连通区域分析标记连通区域过滤小面积区域去除噪声提取边界框和质心参数调优参数推荐值作用learning_rate0.001-0.01背景模型更新速度num_gaussians3-5每个像素的高斯分布数量bg_ratio0.7-0.9背景权重累积阈值variance_threshold15-50高斯分布方差阈值min_area200-1000最小目标面积参考代码 matlab实现高斯背景建模并且提取运动目标(人体)www.youwenfan.com/contentcss/122377.html实际应用技巧阴影处理% 在前景掩码后添加阴影抑制shadow_maskdetect_shadows(fg_mask,frame);fg_mask(shadow_mask)false;自适应参数% 根据场景复杂度动态调整参数ifscene_complexitythreshold learning_rate0.01;min_area800;elselearning_rate0.005;min_area400;end夜间场景优化% 夜间使用红外通道或增强对比度ifis_night_scene(frame)frameenhance_contrast(rgb2gray(frame));end运动历史增强% 使用运动历史图像增强目标连续性mhiupdate_mhi(fg_mask,prev_fg_mask,tau);扩展功能多目标跟踪% 使用Kalman滤波跟踪目标trackskalman_filter_update(tracks,detections);行为识别% 分析目标运动模式behavioranalyze_behavior(track_history);人群密度估计% 基于目标计数估计人群密度densitynum_objects/area;异常事件检测% 检测异常运动模式anomaly_scoredetect_anomaly(motion_features);实际应用场景智能监控系统检测入侵者、遗留物品交通监控车辆计数、违章检测零售分析顾客行为分析、热力图生成人机交互手势识别、动作捕捉视频摘要提取关键运动片段注意对于实际应用建议使用MATLAB的Computer Vision Toolbox中的vision.ForegroundDetector对象它提供了高度优化的高斯混合模型实现。本代码展示了算法的基本原理可根据具体需求进行优化。
返回列表