资源简介
利用Scene_Data文件夹中的视频帧序列实现基于GMM(高斯混合模型)的背景建模。
利用C语言或者Open_CV库,或者是MATLAB软件编写混合高斯模型算法的程序。实现给定图像帧序列的背景建模及跟踪。代码可以通过一个主函数直接运行出实验结果。
要求写出对算法即其实现遇到问题的理解和实时性问题,每秒能处理多少帧,录制代码运行时的视频拷屏
代码片段和文件信息
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%高斯背景建模()
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all
tic;%计时开始%取第一幅符合要求的背景图、
% ------------ frame size variables 帧的变量定义-----------------------
fr = imread(‘00.jpg‘); % 读取第一帧图片作为背景
fr_bw = rgb2gray(fr); % 将背景转换为灰度图像
fr_size = size(fr); %取帧的大小
width = fr_size(2); %将第一帧图片矩阵列数赋给width
height = fr_size(1); %第一帧图片矩阵行数赋给height
fg = zeros(height width); %定义一个相同大小的零矩阵 前景
bg_bw = zeros(height width);%背景
% ------------ mog variables 混合高斯模型变量定义----------------------------------
C = 3; % 组成混合高斯单高斯数目(一般为3~5)
M = 3; % 组成背景的数目
D = 2.5; % 阈值(一般为2.5倍的标准差)
alpha = 0.01; % 学习率 (在 0 到 1之间) (from paper 0.01)决定更新速度
thresh = 0.25; % 前景阈值 (0.25 or 0.75 in paper)
sd_init = 6; % 初始化标准差 (for new components) var = 36 in paper
w = zeros(heightwidthC); % 初始化权值数组矩阵
mean = zeros(heightwidthC); % 像素均值矩阵
sd = zeros(heightwidthC); % 像素标准差矩阵
u_diff = zeros(heightwidthC); % 与均值作差的矩阵
p = alpha/(1/C); % 参与学习率 (用于更新 mean 和 sd)
rank = zeros(1C); % 梯度组成部分,越大愈好 (w/sd)
% ---- initialize component means and weights 初始化均值和权值-----------
pixel_depth = 8; % 像素深度为8位
pixel_range = 2^pixel_depth -1; % 像素范围2的7次方0-255
for i=1:height
for j=1:width
for k=1:C
mean(ijk) = rand*pixel_range; % 随机数 (0-255)
w(ijk) = 1/C; % 权值数组矩阵均匀
sd(ijk) = sd_init; % 初始化 sd_init
end
end
end
%------------ process frames 处理帧-----------------------------------
for n = 0001:0200 %循环共有200幅图片
fr = imread([‘0‘int2str(n)‘.jpg‘]); % 读取帧
fr_bw = rgb2gray(fr); % 转换为灰度图像
% calculate difference of pixel values from mean计算像素差值
for m=1:C
u_diff(::m) = abs(double(fr_bw) - double(mean(::m)));
end
% update gaussian components for each pixel 更新每个像素的背景模型
for i=1:height
for j=1:width
match = 0;
for k=1:C
if (abs(u_diff(ijk)) <= D*sd(ijk)) % 像素匹配了模型
match = 1; % 设置匹配记号
% update weights mean sd p
% 更新 权值 均值 标准差 参数学习率
w(ijk) = (1-alpha)*w(ijk) + alpha;
p = alpha/w(ijk);
mean(ijk) = (1-p)*mean(ijk) + p*double(fr_bw(ij));
sd(ijk) = sqrt((1-p)*(sd(ijk)^2) + p*((double(fr_bw(ij)) - mean(ijk)))^2);
else
- 上一篇:C语言课程设计小学生四则运算
- 下一篇:c++语言基础教程课后答案_吕凤翥编
评论
共有 条评论