天天看點

【目标跟蹤】基于matlab背景差分多目标捕捉【含Matlab源碼 810期】

一、簡介

目标檢測是将運動的物體從背景中檢測出來,人們希望設計能适用于各種監控環境,不受光照、天氣等外界因素影響的目标檢測算法。但這種算法難免複雜度大,現有一些算法大多是針對某一類問題提出的,主要包括背景減法、相鄰幀差法和光流法等。

1背景減法

背景減法(backgroundsubtraction)是目前運動目标檢測的主流方法,其基本思想是将目前每一幀圖像與事先存儲或實時擷取的背景圖像相減,計算出與背景偏離超過一定閥值的區域作為運動區域。該算法實作簡單,相減結果直接給出目标的位置、大小、形狀等資訊,能夠提供關于運動目标區域的完整描述,特别是對于錄影機靜止的情況,背景減法是實作運動目标實時檢測和提取的首選方法。

背景減法實作的關鍵是背景模型的擷取和更新。背景擷取算法通常要求在場景中存在運動目标的情況下擷取背景圖像,更新過程使背景能夠适應場景的各種變化和幹擾,如外界光線的改變,背景中對象的擾動和固定對象的移動,陰影的影響等。一種典型的背景模組化方法是用混合高斯模型描述背景圖像像素值的分布,目标檢測過程中判斷圖像的目前像素值是否符合該分布,若是被判為前景點,否則為背景點。同時根據新擷取的圖像,對背景圖像參數進行自适應更新。該方法能夠可靠處理光照變化、背景混亂運動的幹擾以及長時間的場景變化等。在此基礎上,對背景、靜止目标和運動目标三者采取不同的更新政策,以減弱背景更新過程中運動目标對背景的影響。

二、源代碼

%%基于背景差分的運動目标捕捉
close all;  
clear   
clc
%%%%%%%%%%%%%%%%%%根據一幅目标全可見的圖像圈定跟蹤目标%%%%%%%%%%%%%%%%%%%%%%%
ZMIN=0;
ZMAX=0;
nStar =1 ;%起始幀數
sm=VideoReader('vipmen.mp4');
nNUM = 280;
imu=zeros(120,160);%建立一個與圖檔尺寸相當的空矩陣儲存均值
imxigema=zeros(120,160);%建立一個與圖檔尺寸相當的空矩陣儲存方差
qiuhe=zeros(120,160);%建立一個與圖檔尺寸相當的空矩陣儲存和
for k1=nStar:13      %13的含義是選取的背景幀數到13幀為止
    qiuhe=qiuhe+double(rgb2gray(read(sm,k1)));
end
imu=qiuhe/(13-nStar+1);%求出均值
for k2=nStar:13
    qiuhe=qiuhe+(double(rgb2gray(read(sm,k2)))-imu).^2;
end
imxigema=sqrt(qiuhe/(13-nStar+1));%求出方差
Background = imu;%第一幀當做初始背景
% 背景更新過程,其中int2str将整型常量轉為字元串
for k = nStar+1 : nNUM
    
    CurrentImage =double(rgb2gray(read(sm,k))); % 目前幀
    FormerImage =double(rgb2gray(read(sm,k-1))); % 前一幀
    ID =uint8(abs( CurrentImage - FormerImage ));    % 幀間差分
%%%%%%%%%%%%%%%以下為疊代法求門檻值%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
f=ID;
[sx,sy]=size(f);
%灰階直方圖
h=imhist(f);
%累積直方圖
vmax = 256 ; H(1:vmax)=0; H(1)=h(1);
for i=2:vmax
    H(i) = H(i-1) + h(i); 
end
% 歸一化直方圖
h1 = h / (sx * sy);
%歸一累積直方圖
H1 = H/(sx*sy);
%求初始值
% 初始值設定
% 初始值設定
ZMAX=max(max(f));
ZMIN=min(min(f));
T0=(ZMAX+ZMIN)/2;%取中值作為初始門檻值分割
%疊代法
while 1
    FZ1=0;FZ2=0; %分子
    for i=1:256
        if i<T0
           FZ1=FZ1+(i-1)*h1(i);
        else
           FZ2=FZ2+(i-1)*h1(i);
        end
    end
    u1=FZ1/H1(T0);
    u2=FZ2/(1-H1(T0));
    T1=(u1 + u2)/2;
    if abs(T0-T1)<1
        %求出灰階值比例
        level = double(T0);
        level = level / 255;
        break;
    else
        T0=abs(uint8(T1));
    end
end
%%%%%%%%%%%%%%%%%%%以上代碼均可獨立為一個函數進行調用%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    BW = im2bw(ID,level);
%%%%%%%%%%%%%%%%%%%更新背景,利用高斯背景模型進行%%%%%%%%%%%%%%%%%%%%%%%%%%
    alpha = 0.05; %背景更新的速度
    %高斯背景模組化
    id =abs(abs(Background-imu).*BW-(2.*imxigema+0.02).*BW);
    id(id<0)=0;
    CurrentBack=id+( alpha.* CurrentImage + ( 1-alpha ).* Background ).*( 1 -BW );
    Background = CurrentBack;%背景更新完畢
    %計算新的均值與方差,重建立立目前背景的模型
    imu=(qiuhe+CurrentImage)/(13+k-1);
    imxigema=sqrt(qiuhe+(CurrentImage-imu).^2)/(13+k-1);
%%%%%%%%%%%%%%%%%%背景處理完畢%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
    Cut=abs(CurrentImage-Background);%前景與背景差分
    Cut=uint8(Cut);
%%%%%%%%%%%%%%%以下為疊代法求門檻值%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
f=Cut;
[sx,sy]=size(f);
%灰階直方圖
h=imhist(f);
%累積直方圖
vmax = 256 ; H(1:vmax)=0; H(1)=h(1);
for i=2:vmax
    H(i) = H(i-1) + h(i); 
end
% 歸一化直方圖
h1 = h / (sx * sy);
%歸一累積直方圖
H1 = H/(sx*sy);
%求初始值
% 初始值設定
% 初始值設定
ZMAX=max(max(f));
ZMIN=min(min(f));
T0=(ZMAX+ZMIN)/2;%取中值為初始門檻值
%疊代法
while 1
    FZ1=0;FZ2=0; %分子
    for i=1:256
        if i<T0
           FZ1=FZ1+(i-1)*h1(i);
        else
           FZ2=FZ2+(i-1)*h1(i);
        end
    end
    u1=FZ1/H1(T0);
    u2=FZ2/(1-H1(T0));
    T1=(u1 + u2)/2;
    if abs(T0-T1)<1
        %求出灰階值比例
        level = double(T0);
        level = level / 255;
        break;
    else
        T0=abs(uint8(T1));
    end
           

三、運作結果

四、備注

繼續閱讀