資源簡介
采用Viola-Jones檢測器和卡爾曼濾波,實現了對視頻中人臉的特征跟蹤功能。程序由兩大部分組成,分別是人臉區域的檢測和人臉區域的跟蹤。人臉區域的檢測主要包括:判斷當前幀是否存在人臉區域,以及基于Haar-like特征的人臉區域位置檢測;人臉區域的跟蹤主要包括:利用卡爾曼濾波對當前幀人臉區域的預測跟蹤,以及利用檢測值對人臉區域進行修正。本文使用的是Matlab2014b版本。
代碼片段和文件信息
clear;
clc;
if?~exist(‘result‘)
????mkdir(‘result‘);
end
%?Kalman?filter?initialization
%[p_xp_yv_xv_y]??
%?Si+1?=?Ai*Si?+?ni
%?xi?=?Hi*Si?+?mi
dt=1;
A=[10dt0;010dt;0010;0001];?
H=[1000;0100];
P?=?100*eye(4);?%狀態向量協方差
Q=0.01*eye(4);?%系統動態噪聲
R=[[0.28450.0045]‘[0.00450.0455]‘];?%觀測噪聲
KF_Init_flag?=?1;
%?VideoName?=?‘move2.MOV‘;%待檢測視頻的文件名
VideoName?=?‘video\HBY09.mov‘;%待檢測視頻的文件名
faceDetector?=?vision.CascadeobjectDetector();
videoReader?=?vision.VideoFileReader(VideoName);
obj_writer?=?VideoWriter(‘result\FaceTracker.avi‘);
open(obj_writer);
obj?=?VideoReader(VideoName);
TotalframeNum?=?obj.NumberOfframes;
error?=?zeros(1TotalframeNum);
Predeict_center?=?zeros(TotalframeNum2);
Poster_center?=?zeros(TotalframeNum2);
clear?obj;
k?=1;
while?~isDone(videoReader)
????if?KF_Init_flag==1?%根據上一幀判斷跟蹤目標是丟失
????????videoframe??=?step(videoReader);
????????bboxs?=?step(faceDetectorvideoframe);
????????bboxs_area?=?bboxs(:3).*bboxs(:4);
????????[bbox_areaindex]?=?sort(bboxs_area‘Descend‘);
????????Predict_box?=?[];
????????if?~isempty(bbox_area)
????????????if?bbox_area(1)<12000
???????????????bbox?=?[];???????????????
????????????else
???????????????bbox?=?bboxs(index(1):);
???????????????box_size?=?bbox(3:4);%后驗測量
???????????????State?=?[bbox(1:2)+bbox(3:4)00]‘;
???????????????KF_Init_flag?=0;
????????????end
????????else
????????????bbox?=?[];????????????
????????end
????else??%若上一幀判斷跟蹤目標沒有丟失,則對跟蹤目標在本幀的位置進行預測(先驗)
????????State?=?A?*?State;
????????Predict_box?=?[State(1:2)‘-box_size/2box_size];
????????%檢查是否出界
????????if?Predict_box(1)>?size(videoframe2)||?Predict_box(2)>?size(videoframe1)
????????????Predict_box?=?[];
????????else
????????????if?Predict_box(1)<0
???????????????Predict_box(1)?=?0;?
????????????end
????????????if?Predict_box(2)<0
????????????????Predict_box(2)?=?0;
????????????end
????????????if?Predict_box(1)?+?Predict_box(3)?>?size(videoframe2)
????????????????Predict_box(3)?=?size(videoframe2)?-?Predict_box(1);
????????????end
????????????if?Predict_box(2)?+?Predict_box(4)?>?size(videoframe1)
????????????????Predict_box(4)?=?size(videoframe1)?-?Predict_box(2);
????????????end
????????end
????????%根據對運動目標的觀測值對狀態向量進行修正更新(后驗)
????????videoframe??=?step(videoReader);
????
評論
共有 條評論