• 大小: 5KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-06-01
  • 语言: Matlab
  • 标签:

资源简介

采用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);
    

评论

共有 条评论

相关资源