www.gusucode.com > IPCV_Eval_Kit_R2019a_0ce6858工具箱matlab程序源码 > IPCV_Eval_Kit_R2019a_0ce6858/code/demo_files/I4_08_4_myFaceTrackingKLT.m

    %% 婄専弌側傜傃偵KLT傾儖僑儕僘儉傪梡偄偨僩儔僢僉儞僌
%   婄偑孹偄偨傝嫍棧偑曄傢偭偰傕楢懕偟偨僩儔僢僉儞僌
clc;close all;imtool close all;clear;

%% Step1丗婄偺専弌
% 摦夋僼傽僀儖偐傜夋憸傪撉崬傓僆僽僕僃僋僩偺惗惉
videoFileReader = vision.VideoFileReader('tilted_face.avi');

% 婄専弌梡僆僽僕僃僋僩偺惗惉
faceDetector = vision.CascadeObjectDetector();

% 1僼儗乕儉撉崬傒丄婄傪専弌
frame = step(videoFileReader); 
bbox       = step(faceDetector, frame);

% 専弌偟偨婄偺椞堟傪昞帵
frame = insertShape(frame, 'Rectangle', bbox, 'LineWidth',5);
figure; imshow(frame); title('Detected face');

% 専弌偟偨婄偺夞揮偺壜帇壔偺偨傔偵巐嬿偺揰嵗昗傊曄姺
bboxPoints = bbox2points(bbox(1, :));

%% Step2丗専弌偟偨婄椞堟偱丄摿挜揰(僩儔僢僉儞僌偡傞懳徾)傪専弌
%   (枅僼儗乕儉婄専弌偡傞偲懍搙偑掅壓丒傑偭偡偖側婄偺傒偺専弌婍傪巊梡)

% 婄偺椞堟偱丄僐乕僫乕揰傪専弌
points = detectMinEigenFeatures(rgb2gray(frame), 'ROI', bbox);

% Display the detected points.
figure, imshow(frame), hold on, title('Detected features');
plot(points);

%% Step3丗億僀儞僩僩儔僢僇乕傪弶婜壔
% 億僀儞僩僩儔僢僉儞僌偺僆僽僕僃僋僩偺嶌惉 (僄儔乕偺戝偒側揰偼嶍彍偟偰偄偔傛偆偵愝掕)
pointTracker = vision.PointTracker('MaxBidirectionalError', 2);
% 嵟弶偺僼儗乕儉偲丄偦傟偺僼儗乕儉偱専弌偟偨僐乕僫乕揰偱僩儔僢僇乕傪弶婜壔
points = points.Location;
initialize(pointTracker, points, frame);  

%% 婄偺僩儔僢僉儞僌
% 價僨僆昞帵梡偺僆僽僕僃僋僩偺嶌惉
videoPlayer  = vision.VideoPlayer('Position',...
    [100 100 [size(frame, 2), size(frame, 1)]+30]);

%% Stop 儃僞儞昞帵
a=true;
sz = get(0,'ScreenSize');
figure('MenuBar','none','Toolbar','none','Position',[20 sz(4)-100 100 70])
uicontrol('Style', 'pushbutton', 'String', 'Stop',...
        'Position', [20 20 80 40], 'Callback', 'a=false;');

oldPoints = points;
while ~isDone(videoFileReader) && a
  frame = step(videoFileReader);   % 1僼儗乕儉撉崬傒

  % 揰偺僩儔僢僉儞僌
  [points, isFound] = step(pointTracker, frame);
  visiblePoints = points(isFound, :);  % 尰僼儗乕儉偱尒偮偐偭偨揰
  oldInliers = oldPoints(isFound, :);  % 慜僼儗乕儉偺揰偺拞偱丄尰僼儗乕儉偱傕尒偮偐偭偨傕偺
    
  if size(visiblePoints, 1) >= 2   %億僀儞僩偑2偮埲忋尒偮偐偭偨偲偒
      % 寢壥偺昞帵偺偨傔丄慜僼儗乕儉偐傜尰僼儗乕儉傊偺曄姺峴楍傪媮傔傞
      [xform, oldInliers, visiblePoints] = estimateGeometricTransform(...
          oldInliers, visiblePoints, 'similarity', 'MaxDistance', 4);
      % 嫬奅儃僢僋僗傪婔壗妛曄姺
      bboxPoints = transformPointsForward(xform, bboxPoints);
      % 夋憸僼儗乕儉偵丄嫬奅儃僢僋僗偲揰傪憓擖
      bboxPolygon = reshape(bboxPoints', 1, []);     % 堦峴傊曄姺
      frame = insertShape(frame, 'Polygon', bboxPolygon, 'LineWidth',5);
      frame = insertMarker(frame, visiblePoints, '+', 'Color', 'white');       
      % 尰僼儗乕儉偱尒偮偐偭偨億僀儞僩偱丄僩儔僢僇乕傪嵞弶婜壔
      oldPoints = visiblePoints;
      setPoints(pointTracker, oldPoints);        
  end
    
  step(videoPlayer, frame);   % 1僼儗乕儉昞帵
end

% Clean up
release(videoFileReader);
release(videoPlayer);
release(pointTracker);

%%   Copyright 2012 The MathWorks, Inc.