1.二帧差法实现动态目标检测

先上效果图:


利用GUI界面显示出来效果图为:


实现流程

1.利用matlab中的VideoReader函数读取视频流。
2.帧差法:获得视频帧数,用for循环对图像每相邻两帧之间做差,得到差分后的每一帧视频图像(以二帧差法为例,此处也可采用三帧法、ViBe方法、高斯混合建模法得到动态目标检测的二值图像)。
3.对差分后的图像进行二值化处理,然后填充图形区域和空洞,并进行中值滤波实现图形的去噪。
4.利用形态学知识,对图像进行腐蚀和膨胀,实现进一步去噪和细化图形中的目标。
5.对图形的每一行进行行扫描,找出每一行白色区域的临界端点,并将中间的区域填充为白色,实现目标的区域填充。
6.找到差分图像的上下左右边界,用矩形框将目标在视频中框起来。
7.重复以上操作,即可实现视频流中目标的检测。

1.1读取视频流,完成初始化工作。

利用matlab中的VideoReader函数读取视频流。
利用帧差法获得视频帧数,用for循环对图像每相邻两帧之间做差,得到差分后的每一帧视频图像。

1.2利用帧差法得到差分图像

对差分后的图像进行二值化处理并中值滤波去噪处理后,将其叠加在原图像上

1.3利用形态学知识对象进行膨胀和腐蚀,得出处理后的图像

对差分后的图像填充图形区域和空洞,并进行中值滤波实现图形的去噪,利用形态学知识,对图像进行腐蚀和膨胀,实现进一步去噪和细化图形中的目标

1.4行扫描,对图像进行填充

对图形的每一行进行行扫描,找出每一行白色区域的临界端点,并将中间的区域填充为白色,实现目标的区域填充

1.5找到差分图像的上下左右边界,用矩形框将目标在视频中框起来

2.利用三帧差法实现动态目标检测

算法实现:第三帧与第二帧做差,第二帧与第一帧做差,对这两个差分图像进行交集运算
与二帧差法的区别:相比相邻两帧差法,三帧差法比较适合对运动速度较快物体的检测,但是仍然会有空洞出现,并且物体移动速度较慢时容易丢失轮廓。

代码实现:(利用GUI界面实现,此代码仅为内部的核心部分,下同)

% --- Executes on button press in pushbutton6.
function pushbutton6_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton6 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
videoName = get(handles.edit1, 'String');
videoSource = vision.VideoFileReader(videoName,...'ImageColorSpace', 'RGB', 'VideoOutputDataType', 'uint8');
videoInfo = info(videoSource);
videoRate = videoInfo.VideoFrameRate;
waitTime = 1.0/videoRate;
frame_first = rgb2gray(step(videoSource));
frame = step(videoSource);
global exit_flag;
global pause_flag;
exit_flag = false;
pause_flag = false;
while ~isDone(videoSource) && ~exit_flagif pause_flaguiwait(handles.figure1);endframe_second = rgb2gray(frame);frame = step(videoSource);%读取图像frame_third = rgb2gray(frame);frame_diff1 = abs(frame_second - frame_first);%第二帧和第一帧做差frame_diff2 = abs(frame_third - frame_second);%第三帧和第二帧做差c3= imbinarize(max(frame_diff1,frame_diff2));%对这两个差分图像进行交集运算c3 = imopen(c3, strel('rectangle', [3, 3]));c3= imfill(c3, 'hole');se = strel('disk', 4);c3 =  imerode(c3, se);   se1 = strel('square', 12);c3= imdilate(c3, se1);c3=medfilt2(c3);%中值滤波[m,n] = size(c3);
%%

3.利用ViBe算法实现动态目标检测

ViBe算法,其原理为通过提取像素点(x, y)周围的像素值及以前的像素值建立像素点的样本集,然后再将另一帧(x,y)处的像素值与样本集中的像素值进行比较,如果其与样本集中的像素值的距离大于某阈值的话,则认为该像素点为前景像素点,否则为背景像素点。

代码如下

% --- Executes on button press in pushbutton9.
function pushbutton9_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton9 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
videoName = get(handles.edit1, 'String');
videoSource = vision.VideoFileReader(videoName,...'ImageColorSpace', 'RGB', 'VideoOutputDataType', 'uint8');
videoInfo = info(videoSource);% 参数设置
sample_num = 10;                % 样本库
match_thres = 20;               % 匹配阈值
match_num = 2;                  % 最小匹配数
update_factor = 1;              % 一开始50帧内采用该更新因
next_update_factor = 5;         % 50帧以后的更新因子
cols = videoInfo.VideoSize(1);  % 图像的宽度
rows = videoInfo.VideoSize(2);  % 图像的高度
fore_thres = 20;                % 前景阈值
frame_count = 0;                % 处理帧数
neighbor = [1, 0, -1, -1, 1, 0, 0, -1, 1];  % 邻域选择
% 外部控制标记
global exit_flag;
global pause_flag;
exit_flag = false;
pause_flag = false;
% 判断是否为第一帧
first_flag = true;
while ~isDone(videoSource) && ~exit_flagif pause_flaguiwait(handles.figure1);endframe = step(videoSource);frame_gray = double(rgb2gray(frame));if first_flagfirst_flag = false;%% 开始初始化samples = cell(1, sample_num);% 前两个样本设置初始像素samples{1} = frame_gray;samples{2} = frame_gray;% 剩下的样本初始化for i = 3:sample_numsamples{i} = frame_gray + double(floor(rand(rows, cols) * 20) - 10);endfore_count = uint8(zeros(rows, cols));frame_count = frame_count + 1% 初始化结束continueend%% 前景分割fgMask = uint8(ones(rows, cols) * match_num);for i = 1:sample_numdistance = uint8(abs(samples{i} - frame_gray) <= match_thres);fgMask = fgMask - distance;endfgMask = logical(fgMask * 255);% 更新前景计数for r = 1 : rowsfor c = 1:colsif fgMask(r, c) == 1fore_count(r, c) = fore_count(r, c) + 1;if fore_count(r, c) >= fore_thresfore_count(r,c) = 0;fgMask(r, c) = 0;endelsefore_count(r, c) = 0;endendendupdateMask = fgMask;updateMask = imfill(updateMask, 'hole');%% 更新样本库% 一边更新前景计数,一边更新样本库for r = 2:rows-1for c = 2:cols-1% 为背景时,更新背景样本库if updateMask(r, c) == 0fore_count(r, c) = 0;% 有一定概率更新自身if update_factor == 1 || floor(rand() * update_factor) == 0samples{floor(rand() * sample_num) + 1}(r, c) = frame_gray(r, c);end                % 也有一定概率更新周围像素样本库if update_factor == 1 || floor(rand() * update_factor) == 0samples{floor(rand() * sample_num) + 1}(r + neighbor(floor(rand() * 9) + 1), ...c + neighbor(floor(rand() * 9) + 1)) = frame_gray(r, c);endendendend  frame_count = frame_count + 1if frame_count >= 50update_factor = next_update_factor;end   

4.高斯混合模型法实现动态目标检测

高斯混合模型,其原理为将图像中每一个像素点的颜色值看成是一个随机过程,并假设该点的像素值出现的概率服从高斯分布。每一个像素位置建立多个高斯模型,各个模型中保存该处像素的均值和方差。若新的图片中相应位置的像素值与对应模型中像素的均值的距离小于标准差的λ倍,则该点为背景,否则为前景。

核心代码如下:

% --- Executes on button press in pushbutton8.
function pushbutton8_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton8 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
videoName = get(handles.edit1, 'String');
videoSource = vision.VideoFileReader(videoName,...'ImageColorSpace', 'RGB', 'VideoOutputDataType', 'uint8');
videoInfo = info(videoSource);
videoRate = videoInfo.VideoFrameRate;
waitTime = 1.0/videoRate;
global exit_flag;
global pause_flag;
exit_flag = false;
pause_flag = false;% 参数设置
first_flag = true;
cols = videoInfo.VideoSize(1);
rows = videoInfo.VideoSize(2);
fgMask = zeros(rows, cols);     % 前景矩阵
K = 3;                          % K值为3
D = 2.5;                        % 偏差阈值
alpha = 0.01;                   % 学习速率
Tframe = 50;                    % 帧数阈值
T = 0.8;                        % 前景阈值
sd_init = 15;                   % 初始标准差
w_init = 0.1;                   % 初始权值
ratio = w_init/sd_init;         % 自适应选择高斯分布
W = zeros(rows, cols, K);       % 权值矩阵
mean = zeros(rows, cols, K);    % 均值矩阵
sd = zeros(rows, cols, K);      % 标准差矩阵
g_num = ones(rows, cols);       % 记录每个像素的高斯分布数
u_dist = zeros(rows, cols, K);  % 新像素值与高斯分布均值的绝对值距离
frame_count = 0;                % 处理的帧数
gframe = 10;                    % 每隔几帧,删除无用高斯分布
disk1 = strel('disk', 1);       % 形态学结构元素
disk2 = strel('disk', 4);       % 形态学结构元素while ~isDone(videoSource) && ~exit_flagif pause_flaguiwait(handles.figure1);endframe = step(videoSource);frame_now = double(rgb2gray(frame));if first_flagfirst_flag = false;% 初始化混合高斯模型w_init_m = ones(rows, cols) * 1/K;sd_init_m = ones(rows, cols) * sd_init;for i = 1:K% 均值设为第一帧对应位置的像素mean(:, :, i) = frame_now;W(:, :, i) = w_init_m;sd(:, :, i) = sd_init_m;endframe_count = frame_count + 1g_num = g_num .* 3;continue;endif frame_count <= Tframealpha = 1/(2 * frame_count);end% 前景检测与模型更新for i=1:Ku_dist(:, :, i) = abs(frame_now - mean(:, :, i));end% 自适应选择高斯分布标志adapt_flag = false;if mod(frame_count, gframe) == 0adapt_flag = true;end% 更新每个高斯模型的参数for i=1:rowsfor j=1:colsmatch_ground = false;match = 0;gnum = g_num(i, j);for k = 1:gnum% 符合,3σ原则,则像素值匹配该高斯模型if abs(u_dist(i, j, k)) <= D * sd(i, j, k)match = 1;if ~match_ground && W(i, j, k) >= 0.2match_ground = true;end% 更新权值W(i, j, k) = (1 - alpha) * W(i, j, k) + alpha;p = alpha * normpdf(frame_now(i, j), mean(i, j, k), sd(i, j, k));mean(i, j, k) = (1 - p) * mean(i, j, k) + p * frame_now(i, j);sd(i, j, k) = sqrt((1 - p) * sd(i, j, k)^2 + p * ...(mean(i, j, k) - frame_now(i, j))^2);else% 不匹配W(i, j, k) = (1 - alpha) * W(i, j, k);endend% 如果全部不匹配,替换最小权值的高斯分布或者添加新的高斯分布if match == 0if gnum == K% 替换权值最小的高斯分布[~, min_w_index] = min(W(i, j, :));mean(i, j, min_w_index) = double(frame_now(i, j));sd(i, j, min_w_index) = sd_init;else% 添加新的高斯分布gnum = gnum + 1;W(i, j, gnum) = w_init;mean(i, j, gnum) = double(frame_now(i, j));sd(i, j, gnum) = sd_init;g_num(i, j) = gnum;endend% 权值归一化w_sum = sum(W(i, j, :));W(i, j, :) = W(i, j, :) ./ w_sum;% 进行自适应选择高斯分布个数if adapt_flagrank = W(i, j, :) ./ sd(i, j, :);[~, rank_index] = sort(rank, 'descend');W_temp = W(i, j, :);mean_temp = mean(i, j, :);sd_temp = sd(i, j, :);udist_temp = u_dist(i, j, :);% 根据优先级替换相应的权值,均值和标准差for m = 1:gnumindex = rank_index(m);W(i, j, m) = W_temp(index);mean(i, j, m) = mean_temp(index);sd(i, j, m) = sd_temp(index);u_dist(i, j, m) = udist_temp(index);end% 删除无用高斯分布for m = gnum:-1:1if W(i, j, m) < w_init && rank(rank_index(m)) < ratioW(i, j, m) = 0;g_num(i, j) = g_num(i, j) - 1;elsebreak;endendgnum = g_num(i, j);% 由于部分高斯分布可能被删除,所以需要再进行权值归一化w_sum = sum(W(i, j, :));W(i, j, :) = W(i, j, :) ./ w_sum;end% 已经匹配,则不需要再进行优先级排序判定if match_groundfgMask(i, j) = 0;continue;end% 优先级排序rank = W(i, j, :) ./ sd(i, j, :);[~, rank_index] = sort(rank, 'descend');fgMask(i, j) = 0;k = 1;temp_T = 0;while (match == 0) && (temp_T < T)index = rank_index(k);if abs(u_dist(i, j, index) <= D * sd(i, j, index))fgMask(i, j) = 0;break;elsetemp_T = temp_T + W(i, j, index);fgMask(i, j) = 255;endk = k + 1;endendend% 使用混合高斯背景建模fgMask = logical(fgMask);fgMask = imdilate(imerode(fgMask, disk1), disk2);axes(handles.axes1);imshow(frame);axes(handles.axes2);imshow(fgMask);drawnow;   frame_count = frame_count + 1
end
release(videoSource);

注意:本方法仅仅是目标跟踪,没有涉及到目标检测的内容,也就是说,只要是视频里面动的东西都会被追踪框起来,并且只能框一个。

完整代码获取请添加QQ 1173953942

备注目标跟踪即可

数字图像处理拓展题目——利用Matlab实现动态目标检测 二帧差法、ViBe法、高斯混合模型法,可应用于学生递东西行为检测相关推荐

  1. java数字图像处理开题报告,基于MATLAB的数字图像处理算法研究与仿真开题报告...

    基于MATLAB的数字图像处理算法研究与仿真开题报告 毕 业 设 计 (2013 届) 题 目基于 MATLAB 的数字图像 处理算法研究与仿真 学 院 物理电气信息学院 专 业 通信工程 年 级 0 ...

  2. 《数字图像处理》冈萨雷斯,Matlab函数汇总 .

    <数字图像处理>冈萨雷斯,Matlab函数汇总 . 图像显示 colorbar 显示彩条 getimage 由坐标轴得到图像数据 ice(DIPUM) 交互彩色编辑 image 创建和显示 ...

  3. TIT 数字图像处理 原理与实践(MATLAB) 入门教学 实验三 图像平滑与图像锐化

    文章目录 数字图像处理 原理与实践(MATLAB) 入门教学 实验三 图像平滑与图像锐化 实验要求 知识点 实验内容 1.采用二维中值滤波函数medfilt2对受椒盐噪声干扰的图像滤波,窗口分别采用3 ...

  4. matlab 动态存储图片,利用matlab创建动态图并保存为AVI格式

    利用matlab创建动态图并保存为AVI格式. MATLAB中,创建电影动画的过程分为以下四步: step1:调用moviein函数对内存进行初始化(该步骤在Matlab5.3以上均可省略),创建一个 ...

  5. TIT 数字图像处理 原理与实践(MATLAB) 入门教学 实验一 常用的MATLAB图像处理命令与图像基本操作

    文章目录 数字图像处理 原理与实践(MATLAB) 入门教学 实验一 常用的MATLAB图像处理命令与图像基本操作 实验要求 知识点 实验内容 1.读入一幅RGB图像,变换为灰度图像和二值图像,并在同 ...

  6. 视频目标跟踪算法matlab仿真,对比二帧差法,三帧差法,混合高斯法以及Vibe算法

    目录 1.算法概述 2.仿真效果 3.MATLAB仿真源码 1.算法概述 1.1二帧差法 帧间差分法是一种通过对视频图像序列的连续两帧图像做差分运算获取运动目标轮廓的方法.当监控场景中出现异常目标运动 ...

  7. matlab课程数字图像处理设计题目,数字图像处理课程设计题目和要求_2013

    数字图像处理课程设计内容.要求 题目一:图像处理软件 1.设计内容及要求: (1).独立设计方案,实现对图像的十五种以上处理(比如:底片化效果.灰度增强.图像复原.浮雕效果.木刻效果等等). (2). ...

  8. 用matlab编写逢七必过游戏规则,数字图像处理及应用(MATLAB)第4章

    <数字图像处理及应用(MATLAB)第4章>由会员分享,可在线阅读,更多相关<数字图像处理及应用(MATLAB)第4章(149页珍藏版)>请在人人文库网上搜索. 1.第四章 图 ...

  9. 图像找茬 matlab,数字图像处理、数学形态学、MATLAB GUI实现简单找茬软件

    0.简介 这个小作品是我的数字图像处理课程设计,应用基本的图像处理知识与MATLAB的基本脚本编程,实现一个简单的找茬软件.软件实现过程中使用到的找茬游戏图片来源有"梦幻找茬".& ...

最新文章

  1. cocos2dx-lua之断点调试支持
  2. Git账号以及TortoiseGit配置
  3. 基于c语言画图软件,大佬们,小菜鸟想问一问用vc编译器做简易画图软件
  4. 新浪微博数据网络舆情分析客户端软件
  5. pandas.plotting
  6. 美团程序员吐槽公司蹲位:如厕5分钟找坑两小时
  7. 231个web前端的javascript特效分享
  8. Tracup|10个有效的工作习惯,成功的例子和技巧
  9. python爬虫入门-环境配置
  10. 马尔克斯写给读者的告别信
  11. tf.constant(常量)
  12. Uncaught TypeError: Cannot read property ‘then‘ of undefined
  13. PAT乙级1025题解
  14. win10删除历史壁纸记录
  15. 论文发表时引用的内容也会算重复吗
  16. Android PDF原生实现 PDF阅读、PDF手势伸缩、PDF目录、PDF预览缩略图 PDF方案选择 google doc android-pdfview mupdf pdf.js x5
  17. 计算机上的符号并不代表分数,如何在Excel里轻松插入符号、分数和特殊字符
  18. 基于php技术的web的网上拍卖系统
  19. vue添加图形验证码功能
  20. python二次拟合_三维数据点的二次曲面拟合

热门文章

  1. 相机快门音量大小适配
  2. vlc在Ubuntu下的自动安装和手动安装
  3. 论文阅读_人脸检测:S3FD: Single Shot Scale-invariant Face Detector
  4. 你才二十四岁,为何面容憔悴?
  5. 格拉苏蒂 Glashütte Original
  6. MLflow基于Windows通过Docker和Minio搭建mlflow server
  7. 万卷书- 创新型学校 [Creative Schools]
  8. 专业计算机基础教学,计算机基础教学计划范文五篇
  9. 0基础学习——了解操作符的那些事(一)
  10. Hive第二代客户端远程连接