资源简介
采用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);
评论
共有 条评论