一、帧差分法

摄像机采集的视频序列具有连续性的特点。如果场景内没有运动目标,则连续帧的变化很微弱,如果存在运动目标,则连续的帧和帧之间会有明显地变化。

1.1  两帧差分法

帧间差分法(Temporal Difference)就是借鉴了上述思想。由于场景中的目标在运动,目标的影像在不同图像帧中的位置不同。该类算法对时间上连续的两帧或三帧图像进行差分运算,不同帧对应的像素点相减,判断灰度差的绝对值,当绝对值超过一定阈值时,即可判断为运动目标,从而实现目标的检测功能。

两帧差分法的运算过程如图2-2所示。记视频序列中第n帧和第n−1帧图像为fnfn−1,两帧对应像素点的灰度值记为fn(x,y)和fn−1(x , y),按照式2.13将两帧图像对应像素点的灰度值进行相减,并取其绝对值,得到差分图像Dn

设定阈值T,按照式2.14逐个对像素点进行二值化处理,得到二值化图像Rn'。其中,灰度值为255的点即为前景(运动目标)点,灰度值为0的点即为背景点;对图像Rn'进行连通性分析,最终可得到含有完整运动目标的图像Rn

1.2 三帧差分法

两帧差分法适用于目标运动较为缓慢的场景,当运动较快时,由于目标在相邻帧图像上的位置相差较大,两帧图像相减后并不能得到完整的运动目标,因此,人们在两帧差分法的基础上提出了三帧差分法。

三帧差分法的运算过程如图2-3所示。记视频序列中第n+1帧、第n帧和第n−1帧的图像分别为fn+1、fnfn−1,三帧对应像素点的灰度值记为fn+1(x , y) 、fn(x , y) 和fn−1(x , y) , 按照式2.13分别得到差分图像Dn+1和Dn,对差分图像Dn+1和Dn按照式2.15进行与操作,得到图像Dn',然后再进行阈值处理、连通性分析,最终提取出运动目标。

在帧间差分法中,阈值 的选择非常重要。如果阈值T选取的值太小,则无法抑制差分图像中的噪声;如果阈值T选取的值太大,又有可能掩盖差分图像中目标的部分信息;而且固定的阈值T无法适应场景中光线变化等情况。为此,有人提出了在判决条件中加入对整体光照敏感的添加项的方法,将判决条件修改为:

其中, A为待检测区域中像素的总数目,λ为光照的抑制系数,A可设为整帧图像。添加项表达了整帧图像中光照的变化情况。如果场景中的光照变化较小,则该项的值趋向于零;如果场景中的光照变化明显,则该项的值明显增大,导致式2.16右侧判决条件自适应地增大,最终的判决结果为没有运动目标,这样就有效地抑制了光线变化对运动目标检测结果的影响。

图 2-5 是采用帧间差分法对自拍序列 lab 序列进行运动目标检测的实验结果,(b)图是采用两帧差分法的检测结果,(c)图是采用三帧差分法的检测结果。lab序列中的目标运动较快,在这种情况下,运动目标在不同图像帧内的位置明显不同,采用两帧差分法检测出的目标会出现“重影”的现象,采用三帧差分法,可以检测出较为完整的运动目标。

综上所述,帧间差分法的原理简单,计算量小,能够快速检测出场景中的运动目标。但由实验结果可以看出,帧间差分法检测的目标不完整,内部含有“空洞”,这是因为运动目标在相邻帧之间的位置变化缓慢,目标内部在不同帧图像中相重叠的部分很难检测出来。帧间差分法通常不单独用在目标检测中,往往与其它的检测算法结合使用。

二、混合高斯建模法

高斯模型有单高斯模型(SGM)和混合高斯模型(GMM)两种。

(1)单高斯模型:

为简单起见,阈值t的选取一般靠经验值来设定。通常意义下,我们一般取t=0.7-0.75之间。

二维情况如下所示:

(2)混合高斯模型:

对于(b)图所示的情况,很明显,单高斯模型是无法解决的。为了解决这个问题,人们提出了高斯混合模型(GMM),顾名思义,就是数据可以看作是从数个高斯分布中生成出来的。虽然我们可以用不同的分布来随意地构造 XX Mixture Model ,但是 GMM是 最为流行。另外,Mixture Model 本身其实也是可以变得任意复杂的,通过增加 Model 的个数,我们可以任意地逼近任何连续的概率密分布。

每个 GMM 由 K 个 Gaussian 分布组成,每个 Gaussian 称为一个“Component”,这些 Component 线性加成在一起就组成了 GMM 的概率密度函数:

(1)

其中,πk表示选中这个component部分的概率,我们也称其为加权系数。

根据上面的式子,如果我们要从 GMM 的分布中随机地取一个点的话,实际上可以分为两步:

(1)首先随机地在这 K 个 Component 之中选一个,每个 Component 被选中的概率实际上就是它的系数 πk,选中了 Component 之后,再单独地考虑从这个 Component 的分布中选取一个点就可以了──这里已经回到了普通的 Gaussian 分布,转化为了已知的问题。假设现在有 N 个数据点,我们认为这些数据点由某个GMM模型产生,现在我们要需要确定 πk,μk,σk 这些参数。很自然的,我们想到利用最大似然估计来确定这些参数,GMM的似然函数如下:

(2)

在最大似然估计里面,由于我们的目的是把乘积的形式分解为求和的形式,即在等式的左右两边加上一个log函数,但是由上文博客里的(2)式可以看出,转化为log后,还有log(a+b)的形式,因此,要进一步求解。

三、仿真代码

function varargout = object_detect(varargin)
% OBJECT_DETECT MATLAB code for object_detect.fig
%      OBJECT_DETECT, by itself, creates a new OBJECT_DETECT or raises the existing
%      singleton*.
%
%      H = OBJECT_DETECT returns the handle to a new OBJECT_DETECT or the handle to
%      the existing singleton*.
%
%      OBJECT_DETECT('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in OBJECT_DETECT.M with the given input arguments.
%
%      OBJECT_DETECT('Property','Value',...) creates a new OBJECT_DETECT or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before object_detect_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to object_detect_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help object_detect% Last Modified by GUIDE v2.5 16-May-2018 08:41:00% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...'gui_Singleton',  gui_Singleton, ...'gui_OpeningFcn', @object_detect_OpeningFcn, ...'gui_OutputFcn',  @object_detect_OutputFcn, ...'gui_LayoutFcn',  [] , ...'gui_Callback',   []);
if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT% --- Executes just before object_detect is made visible.
function object_detect_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to object_detect (see VARARGIN)% Choose default command line output for object_detect
handles.output = hObject;% Update handles structure
guidata(hObject, handles);% UIWAIT makes object_detect wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = object_detect_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Get default command line output from handles structure
varargout{1} = handles.output;% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
[filename, pathname] = uigetfile({'*.avi'; '*.mp4'},'打开视频');
str = [pathname filename];
set(handles.edit1, 'String', str);function edit1_Callback(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Hints: get(hObject,'String') returns contents of edit1 as text
%        str2double(get(hObject,'String')) returns contents of edit1 as a double% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');
end% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (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_last = rgb2gray(step(videoSource));
count = 1
global exit_flag;
global pause_flag;
exit_flag = false;
pause_flag = false;while ~isDone(videoSource) && ~exit_flagif pause_flaguiwait(handles.figure1);endframe = step(videoSource);frame_now = rgb2gray(frame);frame_now = medfilt2(frame_now);frame_diff = abs(frame_now - frame_last);fgMask = imbinarize(frame_diff);fgMask = imopen(fgMask, strel('rectangle', [3, 3]));fgMask = imfill(fgMask, 'holes');frame_last = frame_now;axes(handles.axes1);imshow(frame);axes(handles.axes2);imshow(fgMask);pause(waitTime - 0.02);count = count + 1
end
release(videoSource);% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global exit_flag;
exit_flag = true;% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global pause_flag;
pause_flag = true;% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global pause_flag;
pause_flag = false;
uiresume(handles.figure1);% --- 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);end% 显示该帧图像axes(handles.axes1);imshow(frame);frame_second = rgb2gray(frame);frame = step(videoSource);frame_third = rgb2gray(frame);frame_diff1 = abs(frame_second - frame_first);frame_diff2 = abs(frame_third - frame_second);fgMask = imbinarize(min(frame_diff1,frame_diff2));fgMask = imopen(fgMask, strel('rectangle', [3, 3]));fgMask = imfill(fgMask, 'hole');frame_first = frame_second;axes(handles.axes2);imshow(fgMask);pause(waitTime - 0.02);
end
release(videoSource);% --- Executes on button press in pushbutton7.
function pushbutton7_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton7 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
close(gcf);% --- 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;% 已经匹配,则不需要再进行优先级排序判定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);% videoName = get(handles.edit1, 'String');
% videoSource = vision.VideoFileReader(videoName,...
%     'ImageColorSpace', 'RGB', 'VideoOutputDataType', 'uint8');
% detector = vision.ForegroundDetector(...
%     'NumTrainingFrames', 5, ...
%     'InitialVariance', 30 * 30);
% videoInfo = info(videoSource);
% videoRate = videoInfo.VideoFrameRate;
% waitTime = 1.0/videoRate;
% global exit_flag;
% global pause_flag;
% exit_flag = false;
% pause_flag = false;
%
% while ~isDone(videoSource) && ~exit_flag
%     if pause_flag
%         uiwait(handles.figure1);
%     end
%     frame = step(videoSource);
%     frame_now = rgb2gray(frame);
%     fgMask = step(detector, frame_now);
%     fgMask = imopen(fgMask, strel('rectangle', [3, 3]));
%     fgMask = imfill(fgMask, 'holes');
%     axes(handles.axes1);
%     imshow(frame);
%     axes(handles.axes2);
%     imshow(fgMask);
%     pause(waitTime - 0.02);
% end
% release(detector);
% release(videoSource);% --- 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');;imshow(fgMask);drawnow;
end
release(videoSource);

四、仿真结果

【目标检测】基于帧差法+Vibe算法实现车辆行人检测matlab源码相关推荐

  1. 【微电网优化】基于量子行为粒子群算法机组燃烧控制系统建模含Matlab源码

    1 简介 能源问题与环境问题随着现代社会的快速发展已成为中国乃至全世界关注的焦点.就我国现状来说,由于独特的能源架构和社会形态,直接决定了我国的电力工业在当今乃至未来相当长的一段时期内将以燃煤火电机组 ...

  2. 【CV/Matlab系列】基于dwt和Arnold置乱算法的数字水印【含Matlab源码】

    DATE: 2021.3.28 文章目录 前言 1.代码获取方式 2.数字水印实现效果 3.部分Matlab主体实现 前言 在大学课题设计和毕业设计中,要求实现基于dwt和Arnold置乱算法的数字图 ...

  3. 【物流选址】基于佛洛依德算法求解物流选址问题matlab源码

    一.简介 1 弗洛伊德(Floyd)算法介绍\ 1)和Dijkstra算法一 样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵 ...

  4. Python与OpenCV(一)——基于帧差法的运动目标检测程序分析

    OpenCV提供了强大的图像处理功能,与Python的结合堪称完美... 这一次,我们试一下用帧差法来完成对运动目标的检测与跟踪. 帧差法的原理是这样的:由于摄像机采集的视频序列具有连续性的特点,所以 ...

  5. matlab三维路径规划,【路径规划】基于A星算法的三维路径规划matlab源码

    %% 该函数用于演示基于A_Star算法的三维路径规划算法 %% 清空环境 clc clear %% 数据初始化 %下载数据 starttime=cputime; load HeightData z ...

  6. 【MVO TSP】基于matlab灰狼算法求解旅行商问题【含Matlab源码 1327期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab灰狼算法求解旅行商问题[含Matlab源码 1327期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  7. 【雷达通信】基于matlab距离角度解耦法MIMO-OFDM雷达波束形成【含Matlab源码 2208期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[雷达通信]基于matlab距离角度解耦法MIMO-OFDM雷达波束形成[含Matlab源码 2208期] 点击上面蓝色字体,直接付费下载 ...

  8. 【图像重建】基于matlab布雷格曼迭代算法集合ART算法CT图像重建【含Matlab源码 1905期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像重建]基于matlab布雷格曼迭代算法集合ART算法CT图像重建[含Matlab源码 1905期] 获取代码方式2: 通过订阅紫极神光 ...

  9. 【AFSA TSP】基于matlab人工鱼群算法求解旅行商问题【含Matlab源码 422期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab人工鱼群算法求解旅行商问题[含Matlab源码 422期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  10. 【光学】基于matlab GUI矩阵法和等效界面法光学薄膜对反射率影响【含Matlab源码 2102期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI矩阵法和等效界面法光学薄膜对反射率影响[含Matlab源码 2102期] 点击上面蓝色字体,直接付费下载, ...

最新文章

  1. Moodle网络课程上如何添加视频文件
  2. android 入门
  3. ASP.NET MVC 3 RTM
  4. 深入理解Java虚拟机知乎_深入理解Java虚拟机(类文件结构)
  5. NYOJ 1053 Alice and Bob (N)
  6. java代码编写的文本特征提取_Test1 java语言写的特征提取源代码,有搞文字识别的可以下载一看,简单易学 Develop 274万源代码下载- www.pudn.com...
  7. java测试字符串的编码_Java字符串测验
  8. Oracle 列类型说明
  9. STM32中CAN波特率的计算
  10. 【收藏】win10下使用mklink命令给C盘软件搬家
  11. 408计算机考试科目英语数学,关于计算机考研408的那些事儿
  12. 求若当标准型的变换矩阵
  13. 一语中的!抽象工厂和一般工厂的缺点
  14. hdmi网线延长器_HDMI单网线延长器50米高清传输解决方案
  15. javascript 框架_Javascript框架的成本
  16. ESP32 开发笔记(二)OLED ssd1306 apds9960 手势控制
  17. SNG mini项目总结
  18. 我试过销声匿迹最后却无人问津(人生感悟)
  19. python 化学计量学_比特原子 Atombit
  20. Windows7安装SQLServer2012详细亲测教程

热门文章

  1. 11款中兴盒子固件合集分享(已列出全部型号,附刷机教程)
  2. 计算机程序设计类论文,计算机编程论文
  3. 小米4硬改教程_纯干货!抖音从注册到热门的实操教程分享
  4. DevExpress控件之主题
  5. 烟台大学举办首届ACM程序设计大赛
  6. USBCAN 、便携式 CAN 分析仪 、CAN卡
  7. 局域网限速软件_8款Windows实用软件推荐,纯干货,总有一款是你必备的
  8. Spug发布前端项目实战全过程
  9. app测试用例考虑点
  10. mschart控件 用法