目标检测基于matlab GUI背景差分算法视频运动物体跟踪含Matlab源码 1915期

Posted 海神之光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了目标检测基于matlab GUI背景差分算法视频运动物体跟踪含Matlab源码 1915期相关的知识,希望对你有一定的参考价值。

一、背景差分法和帧间差分法的车辆运动目标检测简介

1 引言
运动目标检测是从图像序列中检测运动目标.通过运动目标检测可以得到图像中的运动目标,获取图像中的运动信息.运动目标检测在医学辅助诊断、航天航空、军事导弹精确制导、移动机器人视觉导航、智能交通等领域发挥着重要的作用.因为图像序列受光照、天气、噪声、以及阴影等因素的干扰,精准地检测运动目标显得尤为困难.

目前比较有效的目标检测方法主要是光流法、背景差分法和帧间差分法.光流法的时间复杂度较高,计算量大,实时性较差,且对光线较敏感,变化的光线会被错误地识别为光流.背景差分法和帧间差分法实现简单,且实时性较强,因此有着广泛地应用.帧间差分法只依赖于邻近的几个图像帧,稳定性较好,对环境变化适应性很强,即使在外部环境变化剧烈的情况下,仍然能够取得很好的效果.帧间差分法的缺点是帧间间隔的选取对目标识别的结果影响较大.背景差分法对背景图像的要求相对较苛刻,背景图像不允许存在运动目标,并且能实时更新适应环境的变化.但是传统的运动目标检测算法不能去除车辆运动目标的阴影部分,阴影经常被误检为车辆的一部分,影响获取正确的车辆目标信息.本文提出了将背景差分法和帧间差分法两种方法结合起来的车辆运动目标检测方法,得到去除阴影的车辆运动目标.

1 算法介绍
1.1 背景差分法

背景差分法是运动目标检测最为简单的一种方法.背景差分法的原理,由于运动目标和背景在像素值上存在较明显的差异,利用当前图像与背景图像进行差分,差分图像每一个像素的值与预先设定的阈值进行比较,如果像素值小于阈值,则判定为背景区域,反之为运动目标区域.背景差分的原理流程如下:

首先通过式(1)得到当前图像和背景图像的差分图像,即:

Ek(x,y)=|Pk(x,y)−Bk(x,y)|         (1)

然后根据式(2)对差分图像Ek(x,y)的像素值与给定的阈值进行比较,对差分图像进行二值化,T为给定的阈值,1代表运动目标区域,0代表背景区域.

1.2 帧间差分法
帧间差分法是差分连续两帧来获得运动目标区域.当图像序列中出现运动目标时,两帧之间就会出现较明显地变化.两帧差分得到差分图像,差分图像再通过设定的阈值进行判断,进行图像二值化,来确定图像序列中有无运动目标.

首先通过式(3)得到第k帧图像Pk(x,y)和第k-1帧图像Pk−1(x,y)的差分图像Ek(x,y):

Ek(x,y)=|Pk(x,y)−Pk−1(x,y)|         (3)

然后根据式(4)对差分图像Ek(x,y)的像素值与给定的阈值进行比较,对差分图像进行二值化,T为给定阈值,1代表运动目标区域,0代表背景区域.

2 算法改进
2.1 背景建模

直方图统计背景模型是一个常见的背景建模方法,该算法受噪声的影响较小,因此提取的背景图像较优质,但计算量大,时间复杂度较高.并且图像中较远的景物和运动目标会连接在一起,错误的把运动目标计算为背景,从而影响背景图像的质量.

单高斯背景模型的思想是假设图像中每个像素点的像素值出现的概率服从高斯分布,将像素点的颜色值看作一个随机过程X.设I(x,y,t)表示像素点(x,y,t)在t时刻的像素值,则有:

其中μt和σt为t时刻该像素高斯分布的期望值和标准差.单高斯背景模型仅适用于背景单一不变的场合.基于以上两种背景建模方法的缺陷,以及实验效果,采用均值背景模型来获取背景.算法思想是将车辆运动目标当作噪声,通过累积平均消除噪声,运用包含运动目标的图像序列通过取平均来获取背景图像.简而言之,就是将图像序列所有的像素点求和,取平均值来表示背景.再将平均值与阈值相比较,最后得到背景模型.假如对应位置的像素值超过背景模型中的阈值范围,就认为它是车辆运动目标.公式如下:

其中Bk 表示背景图像,N表示帧的数目,image(x,y)表示在第i帧图像序列中的所有(x,y)像素点所构成的整幅背景图像.

2.2 背景差分二值化
通过均值背景法获取背景模型之后,将当前图像帧Pk(i,j,k)与背景图像Bk(i,j,k)进行式(7)背景差分运算.再通过式(8)进行像素灰度值与阈值的比较,进行二值化,得到车辆运动目标.其表达式为:

车辆运动目标时的敏感程度.

2.3 图像边缘检测
常见的边缘检测算子有Prewitt算子、Roberts算子、Log算子、Canny算子及 Robert算子.相比之下,Roberts算子是一种较简单的算子,采用2×2的模板对图像进行处理,利用局部差分算子寻找边缘,并使用对角线方向相邻两像素之差来近似表示梯度幅值检测边缘.Roberts算子检测垂直边缘的效果优于斜向边缘,定位精度高.实验表明,该算子在分割边缘明显且噪声较少的图像时效果良好,边缘定位准确,相比于其他3×3算子,在不经过图像后处理时,可以给出相对较细的边缘.

对图像函数f(x,y)中的每一个像素元素,通过公式(9)获取该元素的梯度值:

其中,Δxf,Δyf分别为:

2.4 边缘图像差分
分别对背景差分二值化图像与对背景差分图像进行边缘检测,得到了两张边缘图像EG1(x,y)和EG2(x,y).再对两张边缘图像进行帧间差分运算得到

EG(x,y).EG(x,y)=|EG2(x,y)−EG1(x,y)|         (12)

2.5 图像后处理
由于噪声和边缘间断的影响,得到的车辆运动目标图像不够理想,因此需要对差分后的图像进行后处理.利用中值滤波去除部分干扰,利用腐蚀和膨胀剔除部分多余边缘线条,使运动目标区域封闭且完整连续.

二、部分源代码

       function varargout = Main_object_tracking(varargin)
% _____________________________________________________
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
    'gui_Singleton',  gui_Singleton, ...
    'gui_OpeningFcn', @Main_object_tracking_OpeningFcn, ...
    'gui_OutputFcn',  @Main_object_tracking_OutputFcn, ...
    'gui_LayoutFcn',  [] , ...
    'gui_Callback',   []);
if nargin && ischar(varargin1)
    gui_State.gui_Callback = str2func(varargin1);
end

if nargout
    [varargout1:nargout] = gui_mainfcn(gui_State, varargin:);
else
    gui_mainfcn(gui_State, varargin:);
end
% End initialization code - DO NOT EDIT

% --- Executes just before Main_object_tracking is made visible.
function Main_object_tracking_OpeningFcn(hObject, eventdata, handles, varargin)
movegui(hObject,'center')
imaqreset
% ID of video source
handles.fuente=2;
%Disable "Start" and "Stop" buttons
set(handles.inicio,'Enable','off');
set(handles.parar,'Enable','off');
set(hObject,'UserData',0)
set(handles.axes1,'XTickLabel',[],'YTickLabel',[])
% Choose default command line output for Main_object_tracking
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);

% --- Outputs from this function are returned to the command line.
function varargout = Main_object_tracking_OutputFcn(hObject, eventdata, handles)
% Get default command line output from handles structure
varargout1 = handles.output;

% --- FUNCTION TO GET BACKGROUND
function cap_fondo_Callback(hObject, eventdata, handles)
% Reset imaq device
imaqreset
set(hObject,'UserData',0) %User data 0 (1 stop capture)
% Enable "Start" and "Stop" buttons
set(handles.inicio,'Enable','off');
set(handles.parar,'Enable','off');
% Disable current button
set(hObject,'Enable','off');
% Get default source
sel_fuente=handles.fuente;
switch sel_fuente
    % _________________________________________________________________
    case 1 %WEB CAM        
        % Open GUI to select the camera to use
        sel_camera
        %
        uiwait
        % Bring the camera features
        % id= Camera ID
        % es_web_ext= indicator if laptop or external camera
        global id es_web_ext
        % Determine format depending on the type of camera to use
        if es_web_ext==0
            formato='YUY2_176x144';
        else
            formato='RGB24_320x240';
        end
        try
            % Create video object
            vid = videoinput('winvideo',id,formato);
            % Update handles
            guidata(hObject, handles);            
        catch
            % Message on error
            msgbox('Check the connection of the camera','Camera')
            % Remove axis labels
            set(handles.axes1,'XTick',[ ],'YTick',[ ])
        end
        % Specify how often to acquire frame from video stream
        vid.FrameGrabInterval = 1;
        set(vid,'TriggerRepeat',Inf);
        % Start capture
        % _______Get Background_________
        vid.FramesPerTrigger=50;
        start(vid);
        data = getdata(vid,50);
        if es_web_ext==0
            fondo=double(ycbcr2rgb(data(:,:,:,50)));
        else
            fondo=double(data(:,:,:,50));
        end
        % Set last image as background
        % Show background
        imshow(uint8(fondo))
        % Reset video object
        stop(vid);
        clear vid
        imaqreset
    case 2%VIDEO AVI
        [nombre, ruta]=uigetfile('*.avi','SELECT VIDEO AVI');
        if nombre == 0 %If press cancel button, return
            set(hObject,'Enable','on');
            set(handles.inicio,'Enable','on');
            set(handles.parar,'Enable','on');
            return
        end     

三、运行结果

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]罗敏,刘洞波,文浩轩,陈鑫海,宋丹.基于背景差分法和帧间差分法的车辆运动目标检测[J].湖南工程学院学报(自然科学版). 2019,29(04)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

以上是关于目标检测基于matlab GUI背景差分算法视频运动物体跟踪含Matlab源码 1915期的主要内容,如果未能解决你的问题,请参考以下文章

车辆计数基于matlab GUI背景差分法道路行驶多车辆检测含Matlab源码 1911期

目标跟踪基于背景消减的图像帧间差分法目标检测及matlab仿真

图像检测基于帧差法实现人脸实时检测与跟踪matlab源码含 GUI

图像检测基于帧差法实现人脸实时检测与跟踪matlab源码含 GUI

火灾检测基于matlab GUI火灾检测(带面板)含Matlab源码 1646期

常用视频目标跟踪算法仿真对比:帧间差分法,背景差分法,光流法,Meanshift,Camshift