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

    %% Multiple Object Tracking 僠儏乕僩儕傾儖
clear; close all; clc;
videoObjects = setupVideoObjects('singleball.mp4');

%% 摦夋嵞惗 - 偳偺傛偆側摦夋僼傽僀儖傪埖偆偺偐傪妋擣偟傑偡
implay('singleball.mp4')

%% Next&Stop 儃僞儞昞帵
a=true;
b=true;
sz = get(0,'ScreenSize');
figure('MenuBar','none','Toolbar','none','Position',[20 sz(4)-200 100 130])
uicontrol('Style', 'pushbutton', 'String', 'Next',...
    'Position', [20 20 80 40],'Callback', 'a=false;');
uicontrol('Style', 'pushbutton', 'String', 'Stop',...
    'Position', [20 80 80 40],'Callback', 'b=false;');
      
%% 儊僀儞儖乕僾
frameCount = 0;
while b
    % 價僨僆僼儗乕儉偺撉傒崬傒
    frameCount = frameCount + 1;                                % 僼儗乕儉悢僇僂儞僩
    frame = readFrame(videoObjects.reader);                     % 1僼儗乕儉撉傒崬傒
    %暔懱専弌&僩儔僢僉儞僌
    [confirmedTracks, mask, numDetections] = myTracker(frame, frameCount);
    %寢壥偺壜帇壔
    displayTrackingResults(videoObjects, confirmedTracks, frame, mask, numDetections);
    % "Next"儃僞儞偑墴偝傟傞傑偱掆巭
    while (a&&b)
        drawnow limitrate;
    end
    if ~videoObjects.reader.hasFrame
        break;
    end
    a = true;
end

%% 價僨僆僆僽僕僃僋僩偺惗惉
function videoObjects = setupVideoObjects(filename)
        
    % 摦夋僼傽僀儖撉傒崬傒梡僆僽僕僃僋僩偺掕媊
    videoObjects.reader = VideoReader(filename);
    frame = 0;
    videoObjects.reader.CurrentTime = (1/videoObjects.reader.FrameRate) * frame;
        
    % 寢壥壜帇壔梡偺Player僆僽僕僃僋僩偺掕媊  
    videoObjects.maskPlayer  = vision.VideoPlayer('Position', [20, 400, 700, 400]);
    videoObjects.videoPlayer = vision.VideoPlayer('Position', [740, 400, 700, 400]);
end

%% 僩儔僢僉儞僌寢壥偺壜帇壔
function displayTrackingResults(videoObjects, confirmedTracks, frame, mask, numDetections)
    % 僨乕僞宆曄姺
    frame = im2uint8(frame);
    mask = uint8(repmat(mask, [1, 1, 3])) .* 255;
        
    if ~isempty(confirmedTracks)        
        % 専弌偝傟偨僆僽僕僃僋僩偺壜帇壔
        % 僆僽僕僃僋僩偑専弌偝傟側偐偭偨応崌偼丄梊應抣偵傛傞寢壥偑壜帇壔偝傟傑偡
        numRelTr = numel(confirmedTracks);
        boxes = zeros(numRelTr, 4);
        ids = zeros(numRelTr, 1, 'int32');
        color_tbl = cell(numRelTr, 1);
        predictedTrackInds = zeros(numRelTr, 1); 
        for tr = 1:numRelTr
            color_tbl{tr} = 'yellow';
            % 僆僽僕僃僋僩偺Bounding Box庢摼
            boxes(tr, :) = confirmedTracks(tr).ObjectAttributes{1}{1};
             
            % 僩儔僢僋偺ID庢摼
            ids(tr) = confirmedTracks(tr).TrackID;
            
            % 僆僽僕僃僋僩偑専弌偝傟側偐偭偨応崌
            if confirmedTracks(tr).IsCoasted
                predictedTrackInds(tr) = tr;
                boxes(tr, 1:2) = [confirmedTracks(tr).State(1), confirmedTracks(tr).State(3)];
                boxes(tr, 3:4) = 15;
                color_tbl{tr} = 'red';
            end
        end
            
        predictedTrackInds = predictedTrackInds(predictedTrackInds > 0);
            
        % 僩儔僢僋ID傪儔儀儖偲偟偰拪弌
        labels = cellstr(int2str(ids));
            
        isPredicted = cell(size(labels));
        isPredicted(predictedTrackInds) = {' predicted'};
        labels = strcat(labels, isPredicted);
            
        % 拲庍傪憓擖(尦夋憸)
        frame = insertObjectAnnotation(frame, 'rectangle', boxes, labels, 'Color',color_tbl);
            
        % 拲庍傪憓擖(慜宨専弌寢壥偺2抣夋憸)
        mask = insertObjectAnnotation(mask, 'rectangle', boxes, labels);
    end
        
    % Player峏怴
    videoObjects.maskPlayer.step(mask);        
    videoObjects.videoPlayer.step(frame);
end

function [confirmedTracks mask numDetections] = myTracker(frame, frameCount)

    persistent tracker
    persistent detector
    
    % multiObjectTracker偺掕媊
    if isempty(tracker)
        tracker = multiObjectTracker(...
        'FilterInitializationFcn', @initDemoFilter, ...
        'AssignmentThreshold', 30, ...       % 専弌寢壥傪僩儔僢僋偲偟偰妱傝摉偰傞鑷抣
        'NumCoastingUpdates', 10, ...丂      % Coasting忬懺偱僩儔僢僋傪堐帩偡傞挿偝
        'ConfirmationParameters', [6 10] ... % 僩儔僢僋偲偟偰擣幆偝傟傞傑偱偺挿偝
        );
    end
    
    % 慜宨専弌梡僆僽僕僃僋僩偺掕媊
    if isempty(detector)
        detector = vision.ForegroundDetector('NumGaussians', 3, ...
            'NumTrainingFrames', 40, 'MinimumBackgroundRatio', 0.7);
    end

    measurementNoise = 100*eye(2);  
    % 慜宨専弌
    mask = detector.step(frame);
    % 僲僀僘彍嫀
    mask = imopen(mask, strel('rectangle', [6, 6]));
    mask = imclose(mask, strel('rectangle', [50, 50])); 
    mask = imfill(mask, 'holes');
    % 僾儘僷僥傿夝愅
    stats = regionprops(mask, 'Centroid', 'BoundingBox');

    % objectDetections僆僽僕僃僋僩偵Pack
    numDetections = size(stats, 1);
    detections = cell(numDetections, 1);
    if ~isempty(stats)
        for i = 1:numDetections
            detections{i} = objectDetection(frameCount, stats(i).Centroid, ...
                'MeasurementNoise', measurementNoise, ...
                'ObjectAttributes', {stats(i).BoundingBox});
        end
    end

    % 僩儔僢僋峏怴
    confirmedTracks = updateTracks(tracker, detections, frameCount);
end

function filter = initDemoFilter(detection)
    % 僇儖儅儞僼傿儖僞偺弶婜壔
    
    % 弶婜忬懺偺掕媊
    state = [detection.Measurement(1); 0; detection.Measurement(2); 0];

    % 弶婜岆嵎嫟暘嶶峴楍偺掕媊
    stateCov = diag([50, 50, 50, 50]);

    % 僇儖儅儞僼傿儖僞偺掕媊(2D 摍懍儌僨儖)
    filter = trackingKF('MotionModel', '2D Constant Velocity', ...    
        'State', state, ...
        'StateCovariance', stateCov, ... 
        'MeasurementNoise', detection.MeasurementNoise(1:2,1:2) ...    
        );
end

% Copyright 2018 The MathWorks, Inc.