--- DETECTION_BLOCK ---
% Inputs: frame
% Outputs: bboxes, centroids, areas
function [bboxes, centroids, areas] = detection_block(frame)
[Link]('[Link]','[Link]','imopen','imclose
','imfill','strel','rgb2gray');
persistent detector blob initialized
if isempty(initialized) || ~initialized
detector =
[Link]('NumGaussians',3,'NumTrainingFrames',50,'MinimumBackgroun
dRatio',0.7);
blob = [Link]('AreaOutputPort', true, 'BoundingBoxOutputPort',
true, ...
'CentroidOutputPort', true, 'MinimumBlobArea', 400);
initialized = true;
end
gray = [Link]('rgb2gray', frame);
mask = [Link]('step', detector, gray);
mask = [Link]('imopen', mask, strel('disk',3));
mask = [Link]('imclose', mask, strel('disk',15));
mask = [Link]('imfill', mask, 'holes');
[areas, bboxes, centroids] = [Link]('step', blob, mask);
bboxes = double(bboxes);
centroids = double(centroids);
areas = double(areas);
end
--- TRACKING_BLOCK ---
% Inputs: detBBoxes, detCentroids, params
% Outputs: trackersOut
function trackersOut = tracking_block(detBBoxes, detCentroids, params)
[Link]('configureKalmanFilter','predict','correct','munkres');
persistent trackers nextID initialized
if isempty(initialized) || ~initialized
trackers = struct('id',{},'bbox',{},'centroid',{},'kalman',{},'age',
{},'invisible',{},'prevSide',{});
nextID = 1;
initialized = true;
end
detBBoxes = double(detBBoxes); detCentroids = double(detCentroids);
% (use same logic as tracker_manager.m; copy-paste earlier)
% ...
trackersOut = trackers;
end
--- COUNTING_BLOCK ---
% Inputs: trackersIn, countLine
% Outputs: trackersOut, newCount, countedIDsCell
function [trackersOut, newCount, countedIDsCell] = counting_block(trackersIn,
countLine)
newCount = 0; countedIDsCell = {}; trackersOut = trackersIn;
if isempty(trackersIn), return; end
p1 = countLine(1:2); p2 = countLine(3:4);
for i=1:numel(trackersOut)
id = trackersOut(i).id;
c = trackersOut(i).centroid;
sideVal = sign((p2(1)-p1(1))*(c(2)-p1(2)) - (p2(2)-p1(2))*(c(1)-p1(1)));
if isempty(trackersOut(i).prevSide)
trackersOut(i).prevSide = sideVal;
end
prev = trackersOut(i).prevSide;
if prev ~= 0 && sideVal ~= 0 && prev ~= sideVal
newCount = newCount + 1;
countedIDsCell{end+1} = id;
end
trackersOut(i).prevSide = sideVal;
end
end