Matlabscript Botsingsdetectie

From Control Systems Technology Group

(Difference between revisions)
Jump to: navigation, search
 
(2 intermediate revisions not shown)
Line 8: Line 8:
     % and displaying the results.
     % and displaying the results.
     obj = setupSystemObjects();
     obj = setupSystemObjects();
-
  .
+
  <br>
     tracks = initializeTracks(); % Create an empty array of tracks.
     tracks = initializeTracks(); % Create an empty array of tracks.
-
  .
+
  <br>
     nextId = 1; % ID of the next track
     nextId = 1; % ID of the next track
-
  .
+
  <br>
     % Detect moving objects, and track them across video frames.
     % Detect moving objects, and track them across video frames.
     fr=0;
     fr=0;
     disp('Starting...');
     disp('Starting...');
-
  .
+
  <br>
     f = step(obj.reader);
     f = step(obj.reader);
     obj.videoPlayer.step(f); release(obj.videoPlayer);
     obj.videoPlayer.step(f); release(obj.videoPlayer);
-
  .
+
  <br>
     Lastpos = [0 0];
     Lastpos = [0 0];
     Currentpos = [0 0];
     Currentpos = [0 0];
     colvar = 1;
     colvar = 1;
     SHOW = 1;  %turn on/off message box
     SHOW = 1;  %turn on/off message box
-
  .
+
  <br>
     while fr < 41 && isOpen(obj.videoPlayer)
     while fr < 41 && isOpen(obj.videoPlayer)
         fr;
         fr;
Line 37: Line 37:
         fr=fr+1;
         fr=fr+1;
     end
     end
-
  .
+
  <br>
     release(obj.videoPlayer);
     release(obj.videoPlayer);
     obj.videoPlayer.hide();
     obj.videoPlayer.hide();
     close all;
     close all;
-
  .
+
  <br>
     %% Create System Objects
     %% Create System Objects
     % Create System objects used for reading the video frames, detecting
     % Create System objects used for reading the video frames, detecting
     % colored objects, and displaying results.
     % colored objects, and displaying results.
-
  .
+
  <br>
     function obj = setupSystemObjects()
     function obj = setupSystemObjects()
         % Initialize Video
         % Initialize Video
Line 52: Line 52:
         % can be analyzed yet
         % can be analyzed yet
         obj.reader = vision.VideoFileReader('botsing1.mp4');
         obj.reader = vision.VideoFileReader('botsing1.mp4');
-
  .       
+
  <br>     
         % Create a video player
         % Create a video player
         obj.videoPlayer = vision.VideoPlayer('Position', [200, 400, 700, 400]);
         obj.videoPlayer = vision.VideoPlayer('Position', [200, 400, 700, 400]);
-
  .
+
  <br>
         % Create System objects based on movement and blob analysis
         % Create System objects based on movement and blob analysis
         obj.detector = vision.ForegroundDetector('NumGaussians', 3, ...
         obj.detector = vision.ForegroundDetector('NumGaussians', 3, ...
             'NumTrainingFrames', 5, 'MinimumBackgroundRatio', 0.8);
             'NumTrainingFrames', 5, 'MinimumBackgroundRatio', 0.8);
-
  .
+
  <br>
         blob = vision.BlobAnalysis('BoundingBoxOutputPort', true, 'ExcludeBorderBlobs',true, ...
         blob = vision.BlobAnalysis('BoundingBoxOutputPort', true, 'ExcludeBorderBlobs',true, ...
             'MajorAxisLengthOutputPort',true,'EccentricityOutputPort', true, 'CentroidOutputPort', true, ...
             'MajorAxisLengthOutputPort',true,'EccentricityOutputPort', true, 'CentroidOutputPort', true, ...
             'MinimumBlobArea', 2100, 'MaximumBlobArea',50000);
             'MinimumBlobArea', 2100, 'MaximumBlobArea',50000);
     end
     end
-
  .
+
  <br>
     %% Initialize Tracks
     %% Initialize Tracks
     % The structure contains the following fields:
     % The structure contains the following fields:
Line 81: Line 81:
     %                                This results in deleting the track if the
     %                                This results in deleting the track if the
     %                                threshold is reached
     %                                threshold is reached
-
  .
+
  <br>
     function tracks = initializeTracks()
     function tracks = initializeTracks()
         % create an empty array of tracks
         % create an empty array of tracks
Line 92: Line 92:
             'consecutiveInvisibleCount', {});
             'consecutiveInvisibleCount', {});
     end
     end
-
  .
+
  <br>
     %% Read a Video Frame
     %% Read a Video Frame
     % Read the next video frame from the video file.
     % Read the next video frame from the video file.
Line 99: Line 99:
         %frame = snapshot(cam);
         %frame = snapshot(cam);
     end
     end
-
  .
+
  <br>
     %% Detect Objects
     %% Detect Objects
     % The |detectObjects| function returns the centroids and the bounding boxes
     % The |detectObjects| function returns the centroids and the bounding boxes
Line 105: Line 105:
     % same size as the input frame. Pixels with a value of 1 correspond to the
     % same size as the input frame. Pixels with a value of 1 correspond to the
     % foreground, and pixels with a value of 0 correspond to the background.  
     % foreground, and pixels with a value of 0 correspond to the background.  
-
  .
+
  <br>
     function [centroids, bboxes, mask] = detectObjects(frame, blob)
     function [centroids, bboxes, mask] = detectObjects(frame, blob)
-
  .      
+
  <br>      
     % Use color to identify turtles from each team. Only these colors will
     % Use color to identify turtles from each team. Only these colors will
     % be taken into account. A distinctive top color results in more  
     % be taken into account. A distinctive top color results in more  
Line 113: Line 113:
     Red = frame*255;
     Red = frame*255;
     Red = Red(:,:,1)>Red(:,:,2)*2 & Red(:,:,1)>Red(:,:,2)*2;
     Red = Red(:,:,1)>Red(:,:,2)*2 & Red(:,:,1)>Red(:,:,2)*2;
-
  .
+
  <br>
     mask = obj.detector.step(frame);
     mask = obj.detector.step(frame);
   % Apply morphological operations to remove noise and fill in holes.
   % Apply morphological operations to remove noise and fill in holes.
Line 119: Line 119:
     mask = imclose(mask, strel('rectangle', [15, 15]));  
     mask = imclose(mask, strel('rectangle', [15, 15]));  
     mask = imfill(mask, 'holes');
     mask = imfill(mask, 'holes');
-
  .
+
  <br>
   % detect blobs, return centroids, bounding boxes, eccentricity and diameter
   % detect blobs, return centroids, bounding boxes, eccentricity and diameter
   [~,centroids,bboxes,diam,ecc] = step(blob,Red);               
   [~,centroids,bboxes,diam,ecc] = step(blob,Red);               
-
  .
+
  <br>
   % maximize for most round object
   % maximize for most round object
   if ~isempty(centroids)     
   if ~isempty(centroids)     
Line 137: Line 137:
         diam = [];
         diam = [];
   end
   end
-
  .
+
  <br>
     end
     end
     %% Predict New Locations of Existing Tracks
     %% Predict New Locations of Existing Tracks
     % Use the Kalman filter to predict the centroid of each track in the
     % Use the Kalman filter to predict the centroid of each track in the
     % current frame, and update its bounding box accordingly.
     % current frame, and update its bounding box accordingly.
-
  .
+
  <br>
     function predictNewLocationsOfTracks()
     function predictNewLocationsOfTracks()
       for i = 1:length(tracks)
       for i = 1:length(tracks)
             bbox = tracks(i).bbox;
             bbox = tracks(i).bbox;
-
  .
+
  <br>
             % Predict the current location of the track.
             % Predict the current location of the track.
             predictedCentroid = predict(tracks(i).kalmanFilter);
             predictedCentroid = predict(tracks(i).kalmanFilter);
Line 155: Line 155:
       end
       end
     end
     end
-
  .
+
  <br>
     %% Assign Detections to Tracks
     %% Assign Detections to Tracks
     % Assigning object detections in the current frame to existing tracks is
     % Assigning object detections in the current frame to existing tracks is
     % done by minimizing cost. The cost is defined as the negative
     % done by minimizing cost. The cost is defined as the negative
     % log-likelihood of a detection corresponding to a track.   
     % log-likelihood of a detection corresponding to a track.   
-
  .
+
  <br>
     function [assignments, unassignedTracks, unassignedDetections] = ...
     function [assignments, unassignedTracks, unassignedDetections] = ...
             detectionToTrackAssignment()
             detectionToTrackAssignment()
-
  .
+
  <br>
         nTracks = length(tracks);
         nTracks = length(tracks);
         nDetections = size(centroids, 1);
         nDetections = size(centroids, 1);
-
  .
+
  <br>
         % Compute the cost of assigning each detection to each track.
         % Compute the cost of assigning each detection to each track.
         cost = zeros(nTracks, nDetections);
         cost = zeros(nTracks, nDetections);
Line 172: Line 172:
             cost(1, :) = distance(tracks(1).kalmanFilter, centroids);
             cost(1, :) = distance(tracks(1).kalmanFilter, centroids);
         end
         end
-
  .
+
  <br>
         % Solve the assignment problem.
         % Solve the assignment problem.
         costOfNonAssignment = 20;
         costOfNonAssignment = 20;
Line 178: Line 178:
             assignDetectionsToTracks(cost, costOfNonAssignment);
             assignDetectionsToTracks(cost, costOfNonAssignment);
     end
     end
-
  .
+
  <br>
     %% Update Assigned Tracks
     %% Update Assigned Tracks
     % The |updateAssignedTracks| function updates each assigned track with the
     % The |updateAssignedTracks| function updates each assigned track with the
Line 185: Line 185:
     % the new bounding box, and increases the age of the track and the total
     % the new bounding box, and increases the age of the track and the total
     % visible count by 1. Finally, the function sets the invisible count to 0.
     % visible count by 1. Finally, the function sets the invisible count to 0.
-
  .
+
  <br>
     function updateAssignedTracks()
     function updateAssignedTracks()
         numAssignedTracks = size(assignments, 1);
         numAssignedTracks = size(assignments, 1);
Line 193: Line 193:
             centroid = centroids(detectionIdx, :);
             centroid = centroids(detectionIdx, :);
             bbox = bboxes(detectionIdx, :);
             bbox = bboxes(detectionIdx, :);
-
  .
+
  <br>
             % Correct the estimate of the object's location
             % Correct the estimate of the object's location
             % using the new detection. This will give the current position
             % using the new detection. This will give the current position
Line 203: Line 203:
             % Update track's age.
             % Update track's age.
             tracks(trackIdx).age = tracks(trackIdx).age + 1;
             tracks(trackIdx).age = tracks(trackIdx).age + 1;
-
  .
+
  <br>
             % Update visibility.
             % Update visibility.
             tracks(trackIdx).totalVisibleCount = ...
             tracks(trackIdx).totalVisibleCount = ...
Line 212: Line 212:
         end
         end
     end
     end
-
  .
+
  <br>
     %% Create New Tracks
     %% Create New Tracks
     % Create new tracks from unassigned detections. Assume that any unassigned
     % Create new tracks from unassigned detections. Assume that any unassigned
     % detection is a start of a new track. In practice, you can use other cues
     % detection is a start of a new track. In practice, you can use other cues
     % to eliminate noisy detections, such as size, location, or appearance.
     % to eliminate noisy detections, such as size, location, or appearance.
-
  .
+
  <br>
     function createNewTracks()
     function createNewTracks()
         centroids = centroids(unassignedDetections, :);
         centroids = centroids(unassignedDetections, :);
         bboxes = bboxes(unassignedDetections, :);
         bboxes = bboxes(unassignedDetections, :);
-
  .
+
  <br>
         for i = 1:size(centroids, 1)
         for i = 1:size(centroids, 1)
-
  .
+
  <br>
             centroid = centroids(i,:);
             centroid = centroids(i,:);
             bbox = bboxes(i, :);
             bbox = bboxes(i, :);
-
  .
+
  <br>
             % Create a Kalman filter object.
             % Create a Kalman filter object.
             kalmanFilter = configureKalmanFilter('ConstantVelocity', ...
             kalmanFilter = configureKalmanFilter('ConstantVelocity', ...
                 centroid, [200, 50], [100, 25], 200);
                 centroid, [200, 50], [100, 25], 200);
-
  .
+
  <br>
             % Create a new track.
             % Create a new track.
             newTrack = struct(...
             newTrack = struct(...
Line 239: Line 239:
                 'totalVisibleCount', 4, ...
                 'totalVisibleCount', 4, ...
                 'consecutiveInvisibleCount', 0);
                 'consecutiveInvisibleCount', 0);
-
  .
+
  <br>
             % Add it to the array of tracks.
             % Add it to the array of tracks.
             tracks(end + 1) = newTrack;
             tracks(end + 1) = newTrack;
-
  .
+
  <br>
             % Increment the next id.
             % Increment the next id.
             nextId = nextId + 1;
             nextId = nextId + 1;
         end
         end
     end
     end
-
  .
+
  <br>
     %% Display Tracking Results
     %% Display Tracking Results
     % The |displayTrackingResults| function draws a bounding box and label ID  
     % The |displayTrackingResults| function draws a bounding box and label ID  
     % for each track on the video frame and the foreground mask. It then  
     % for each track on the video frame and the foreground mask. It then  
     % displays the frame and the mask in their respective video players.  
     % displays the frame and the mask in their respective video players.  
-
  .
+
  <br>
     function displayTrackingResults()
     function displayTrackingResults()
         % Convert the frame and the mask to uint8 RGB.
         % Convert the frame and the mask to uint8 RGB.
         frame = im2uint8(frame);
         frame = im2uint8(frame);
         mask = uint8(repmat(mask, [1, 1, 3])) .* 255;
         mask = uint8(repmat(mask, [1, 1, 3])) .* 255;
-
  .
+
  <br>
         minVisibleCount = 8;
         minVisibleCount = 8;
         if ~isempty(tracks)
         if ~isempty(tracks)
-
  .
+
  <br>
             % Noisy detections tend to result in short-lived tracks.
             % Noisy detections tend to result in short-lived tracks.
             % Only display tracks that have been visible for more than  
             % Only display tracks that have been visible for more than  
Line 267: Line 267:
                 [tracks(:).totalVisibleCount] > minVisibleCount;
                 [tracks(:).totalVisibleCount] > minVisibleCount;
             reliableTracks = tracks(reliableTrackInds);
             reliableTracks = tracks(reliableTrackInds);
-
  .
+
  <br>
             % Display the objects. If an object has not been detected
             % Display the objects. If an object has not been detected
             % in this frame, display its predicted bounding box.
             % in this frame, display its predicted bounding box.
Line 273: Line 273:
                 % Get bounding boxes.
                 % Get bounding boxes.
                 bboxes = cat(1, reliableTracks.bbox);
                 bboxes = cat(1, reliableTracks.bbox);
-
  .
+
  <br>
                 % Get ids.
                 % Get ids.
                 ids = int32([reliableTracks(:).id]);
                 ids = int32([reliableTracks(:).id]);
-
  .
+
  <br>
                 % Create labels for objects indicating the ones for  
                 % Create labels for objects indicating the ones for  
                 % which we display the predicted rather than the actual  
                 % which we display the predicted rather than the actual  
Line 286: Line 286:
                 isPredicted(predictedTrackInds) = {' predicted'};
                 isPredicted(predictedTrackInds) = {' predicted'};
                 labels = strcat(labels, isPredicted);
                 labels = strcat(labels, isPredicted);
-
  .
+
  <br>
                 labels = 'Red Ball';
                 labels = 'Red Ball';
                 % Draw the objects on the frame.
                 % Draw the objects on the frame.
                 frame = insertObjectAnnotation(frame, 'rectangle', ...
                 frame = insertObjectAnnotation(frame, 'rectangle', ...
                     bboxes, labels);
                     bboxes, labels);
-
  .
+
  <br>
                 % Draw the objects on the mask.
                 % Draw the objects on the mask.
                 mask = insertObjectAnnotation(mask, 'rectangle', ...
                 mask = insertObjectAnnotation(mask, 'rectangle', ...
Line 297: Line 297:
             end
             end
         end
         end
-
  .
+
  <br>
         % Display the mask and the frame.       
         % Display the mask and the frame.       
         obj.videoPlayer.step(frame);
         obj.videoPlayer.step(frame);
     end
     end
-
  .
+
  <br>
     %% Store previous location
     %% Store previous location
     % The |saveposition| function stores the location of the previous frame to
     % The |saveposition| function stores the location of the previous frame to
     % allow for the calculation of a direction vector created from consecutive
     % allow for the calculation of a direction vector created from consecutive
     % frames
     % frames
-
  .
+
  <br>
     function saveposition()
     function saveposition()
         if fr <2
         if fr <2
Line 314: Line 314:
         end
         end
     end
     end
-
  .
+
  <br>
     %% Check for a collision
     %% Check for a collision
     % The |checkcollision| function checks every frame if there is a sudden
     % The |checkcollision| function checks every frame if there is a sudden
     % change in the direction compared to its previous. If more elaborate  
     % change in the direction compared to its previous. If more elaborate  
     % collision rules apply, one can look to find the acceleration
     % collision rules apply, one can look to find the acceleration
-
  .
+
  <br>
     function checkcollision()
     function checkcollision()
         if ~isempty(Lastpos) && fr >17  %% Bounding box drawn
         if ~isempty(Lastpos) && fr >17  %% Bounding box drawn
Line 332: Line 332:
         end
         end
     end
     end
-
  .
+
  <br>
  end
  end
</code>
</code>
-
A link to the matlab code can be found here: [http://www.example.com link title]
+
Een link naar de matlab code staat hier: [https://www.dropbox.com/sh/gbh5m6odnoqne99/AABFMLRutZ_o2IONJv1cpYDWa?dl=0 All-Project Matlab Files]
----
----
Terug naar: [[Botsingsdetectie]]
Terug naar: [[Botsingsdetectie]]

Current revision as of 23:14, 13 January 2016

Hieronder staat de Matlab-code voor de botsingsdetectie. Comments over gebruikte code staan in het script erbij vermeldt.

function Collision_detection()
   clc
   % Create System objects used for reading video, detecting moving objects,
   % and displaying the results.
   obj = setupSystemObjects();

tracks = initializeTracks(); % Create an empty array of tracks.
nextId = 1; % ID of the next track
 % Detect moving objects, and track them across video frames. fr=0; disp('Starting...');
f = step(obj.reader); obj.videoPlayer.step(f); release(obj.videoPlayer);
Lastpos = [0 0]; Currentpos = [0 0]; colvar = 1; SHOW = 1;  %turn on/off message box
while fr < 41 && isOpen(obj.videoPlayer) fr; frame = readFrame(); [centroids, bboxes, mask] = detectObjects(frame, blob); predictNewLocationsOfTracks(); [assignments, ~ , unassignedDetections] = ... detectionToTrackAssignment(); updateAssignedTracks();  %position createNewTracks(); displayTrackingResults(); fr=fr+1; end
release(obj.videoPlayer); obj.videoPlayer.hide(); close all;
 %% Create System Objects  % Create System objects used for reading the video frames, detecting  % colored objects, and displaying results.
function obj = setupSystemObjects()  % Initialize Video  % Create objects for reading a video from a file, drawing the tracked  % objects in each frame, and playing the video. No live camera data  % can be analyzed yet obj.reader = vision.VideoFileReader('botsing1.mp4');
 % Create a video player obj.videoPlayer = vision.VideoPlayer('Position', [200, 400, 700, 400]);
 % Create System objects based on movement and blob analysis obj.detector = vision.ForegroundDetector('NumGaussians', 3, ... 'NumTrainingFrames', 5, 'MinimumBackgroundRatio', 0.8);
blob = vision.BlobAnalysis('BoundingBoxOutputPort', true, 'ExcludeBorderBlobs',true, ... 'MajorAxisLengthOutputPort',true,'EccentricityOutputPort', true, 'CentroidOutputPort', true, ... 'MinimumBlobArea', 2100, 'MaximumBlobArea',50000); end
 %% Initialize Tracks  % The structure contains the following fields:  %  % * |id| : the integer ID of the track  % * |bbox| : the current bounding box of the object; used  % for display  % * |kalmanFilter| : a Kalman filter object used for motion-based  % tracking  % * |age| : the number of frames since the track was first  % detected  % * |totalVisibleCount| : the total number of frames in which the track  % was detected (visible)  % * |consecutiveInvisibleCount| : the number of consecutive frames for  % which the track was not detected (invisible).  % This results in deleting the track if the  % threshold is reached
function tracks = initializeTracks()  % create an empty array of tracks tracks = struct(... 'id', {}, ... 'bbox', {}, ... 'kalmanFilter', {}, ... 'age', {}, ... 'totalVisibleCount', {}, ... 'consecutiveInvisibleCount', {}); end
 %% Read a Video Frame  % Read the next video frame from the video file. function frame = readFrame() frame = obj.reader.step();  %frame = snapshot(cam); end
 %% Detect Objects  % The |detectObjects| function returns the centroids and the bounding boxes  % of the detected objects. It also returns the binary mask, which has the  % same size as the input frame. Pixels with a value of 1 correspond to the  % foreground, and pixels with a value of 0 correspond to the background.
function [centroids, bboxes, mask] = detectObjects(frame, blob)
 % Use color to identify turtles from each team. Only these colors will  % be taken into account. A distinctive top color results in more  % accurate tracking. Red = frame*255; Red = Red(:,:,1)>Red(:,:,2)*2 & Red(:,:,1)>Red(:,:,2)*2;
mask = obj.detector.step(frame);  % Apply morphological operations to remove noise and fill in holes. mask = imopen(mask, strel('rectangle', [9,9])); mask = imclose(mask, strel('rectangle', [15, 15])); mask = imfill(mask, 'holes');
 % detect blobs, return centroids, bounding boxes, eccentricity and diameter [~,centroids,bboxes,diam,ecc] = step(blob,Red);
 % maximize for most round object if ~isempty(centroids) [~,I] = max(ecc,[],1); bboxes = bboxes(I,:); centroids = centroids(I,:); diam = diam(I); end  %check if max is indeed round (i.e. if anything useful detected) if ecc > 1 ecc = []; centroids = []; bboxes = []; diam = []; end
end  %% Predict New Locations of Existing Tracks  % Use the Kalman filter to predict the centroid of each track in the  % current frame, and update its bounding box accordingly.
function predictNewLocationsOfTracks() for i = 1:length(tracks) bbox = tracks(i).bbox;
 % Predict the current location of the track. predictedCentroid = predict(tracks(i).kalmanFilter);  % Shift the bounding box so that its center is at  % the predicted location. predictedCentroid = int32(predictedCentroid) - bbox(3:4) / 2; tracks(i).bbox = [predictedCentroid, bbox(3:4)]; end end
 %% Assign Detections to Tracks  % Assigning object detections in the current frame to existing tracks is  % done by minimizing cost. The cost is defined as the negative  % log-likelihood of a detection corresponding to a track.
function [assignments, unassignedTracks, unassignedDetections] = ... detectionToTrackAssignment()
nTracks = length(tracks); nDetections = size(centroids, 1);
 % Compute the cost of assigning each detection to each track. cost = zeros(nTracks, nDetections); if nTracks>0 cost(1, :) = distance(tracks(1).kalmanFilter, centroids); end
 % Solve the assignment problem. costOfNonAssignment = 20; [assignments, unassignedTracks, unassignedDetections] = ... assignDetectionsToTracks(cost, costOfNonAssignment); end
 %% Update Assigned Tracks  % The |updateAssignedTracks| function updates each assigned track with the  % corresponding detection. It calls the |correct| method of  % |vision.KalmanFilter| to correct the location estimate. Next, it stores  % the new bounding box, and increases the age of the track and the total  % visible count by 1. Finally, the function sets the invisible count to 0.
function updateAssignedTracks() numAssignedTracks = size(assignments, 1); for i = 1:numAssignedTracks trackIdx = assignments(i, 1); detectionIdx = assignments(i, 2); centroid = centroids(detectionIdx, :); bbox = bboxes(detectionIdx, :);
 % Correct the estimate of the object's location  % using the new detection. This will give the current position Currentpos = correct(tracks(trackIdx).kalmanFilter, centroid);  % Replace predicted bounding box with detected  % bounding box. tracks(trackIdx).bbox = bbox;  % Update track's age. tracks(trackIdx).age = tracks(trackIdx).age + 1;
 % Update visibility. tracks(trackIdx).totalVisibleCount = ... tracks(trackIdx).totalVisibleCount + 1; tracks(trackIdx).consecutiveInvisibleCount = 0; checkcollision(); saveposition(); end end
 %% Create New Tracks  % Create new tracks from unassigned detections. Assume that any unassigned  % detection is a start of a new track. In practice, you can use other cues  % to eliminate noisy detections, such as size, location, or appearance.
function createNewTracks() centroids = centroids(unassignedDetections, :); bboxes = bboxes(unassignedDetections, :);
for i = 1:size(centroids, 1)
centroid = centroids(i,:); bbox = bboxes(i, :);
 % Create a Kalman filter object. kalmanFilter = configureKalmanFilter('ConstantVelocity', ... centroid, [200, 50], [100, 25], 200);
 % Create a new track. newTrack = struct(... 'id', nextId, ... 'bbox', bbox, ... 'kalmanFilter', kalmanFilter, ... 'age', 1, ... 'totalVisibleCount', 4, ... 'consecutiveInvisibleCount', 0);
 % Add it to the array of tracks. tracks(end + 1) = newTrack;
 % Increment the next id. nextId = nextId + 1; end end
 %% Display Tracking Results  % The |displayTrackingResults| function draws a bounding box and label ID  % for each track on the video frame and the foreground mask. It then  % displays the frame and the mask in their respective video players.
function displayTrackingResults()  % Convert the frame and the mask to uint8 RGB. frame = im2uint8(frame); mask = uint8(repmat(mask, [1, 1, 3])) .* 255;
minVisibleCount = 8; if ~isempty(tracks)
 % Noisy detections tend to result in short-lived tracks.  % Only display tracks that have been visible for more than  % a minimum number of frames. reliableTrackInds = ... [tracks(:).totalVisibleCount] > minVisibleCount; reliableTracks = tracks(reliableTrackInds);
 % Display the objects. If an object has not been detected  % in this frame, display its predicted bounding box. if ~isempty(reliableTracks)  % Get bounding boxes. bboxes = cat(1, reliableTracks.bbox);
 % Get ids. ids = int32([reliableTracks(:).id]);
 % Create labels for objects indicating the ones for  % which we display the predicted rather than the actual  % location. labels = cellstr(int2str(ids')); predictedTrackInds = ... [reliableTracks(:).consecutiveInvisibleCount] > 0; isPredicted = cell(size(labels)); isPredicted(predictedTrackInds) = {' predicted'}; labels = strcat(labels, isPredicted);
labels = 'Red Ball';  % Draw the objects on the frame. frame = insertObjectAnnotation(frame, 'rectangle', ... bboxes, labels);
 % Draw the objects on the mask. mask = insertObjectAnnotation(mask, 'rectangle', ... bboxes, labels); end end
 % Display the mask and the frame. obj.videoPlayer.step(frame); end
 %% Store previous location  % The |saveposition| function stores the location of the previous frame to  % allow for the calculation of a direction vector created from consecutive  % frames
function saveposition() if fr <2 Lastpos = [0 0]; elseif fr >= 2 Lastpos = Currentpos; end end
 %% Check for a collision  % The |checkcollision| function checks every frame if there is a sudden  % change in the direction compared to its previous. If more elaborate  % collision rules apply, one can look to find the acceleration
function checkcollision() if ~isempty(Lastpos) && fr >17  %% Bounding box drawn if (Currentpos(1) > Lastpos(1))&&(Currentpos(2) > Lastpos(2)) ... && colvar == 1 fprintf('BOTSING in frame %u \n', fr); if SHOW == 1 h =msgbox('Collision occured!'); end colvar = colvar + 1; end end end
end

Een link naar de matlab code staat hier: All-Project Matlab Files


Terug naar: Botsingsdetectie

Personal tools