|
@@ -0,0 +1,114 @@
|
|
|
+% Directory setting
|
|
|
+frame_directory = 'data/frames/';
|
|
|
+mask_directory = 'data/predicts/';
|
|
|
+video_names = dir( [frame_directory 'sample*'] );
|
|
|
+
|
|
|
+% Enhancing figure visibility
|
|
|
+set(gcf, 'Position', [0 0 800 800], 'Color', [1 1 1] );
|
|
|
+
|
|
|
+% Figure to video
|
|
|
+output_video_option = 1;
|
|
|
+if output_video_option
|
|
|
+ output_video_directory = 'data/output/';
|
|
|
+ if ~isdir(output_video_directory), mkdir(output_video_directory); end
|
|
|
+end
|
|
|
+
|
|
|
+% Main loop
|
|
|
+for videoIdx = 1:length( video_names )
|
|
|
+ frame_names = dir( [frame_directory video_names(videoIdx).name '/*.jpg']);
|
|
|
+ mask_names = dir( [mask_directory video_names(videoIdx).name '/*.jpg']);
|
|
|
+
|
|
|
+ %% For one video
|
|
|
+ xy = nan([2,length( frame_names )]);
|
|
|
+ bb = nan([4,length( frame_names )]);
|
|
|
+ for frameIdx = 1:length( frame_names )
|
|
|
+
|
|
|
+ %% Single frame loading
|
|
|
+ frame_name = [ frame_names(frameIdx).folder ...
|
|
|
+ '/' frame_names(frameIdx).name];
|
|
|
+ mask_name = [ mask_names(frameIdx).folder ...
|
|
|
+ '/' mask_names(frameIdx).name];
|
|
|
+
|
|
|
+ frame = double(imread( frame_name ))/255; % Scaling to 0-1
|
|
|
+ mask = double(imread( mask_name ))/255; % Scaling to 0-1
|
|
|
+
|
|
|
+ % Manual artifact rejection
|
|
|
+ mask(:,1:30) = 0;
|
|
|
+
|
|
|
+ % Visualization
|
|
|
+
|
|
|
+ % Original frame
|
|
|
+ sp1 = subplot(2,2,1); hold off
|
|
|
+ imagesc( frame );
|
|
|
+ set(gca, 'Box', 'off', 'LineWidth', 2, 'XTick', [], 'YTick', [], 'FontSize', 15);
|
|
|
+ title( sprintf( '(1) Frame #%04d', frameIdx ));
|
|
|
+ colormap(sp1, 'gray');
|
|
|
+
|
|
|
+ % Mask
|
|
|
+ sp2 = subplot(2,2,2); hold off
|
|
|
+ imagesc( mask' );
|
|
|
+ set(gca, 'Box', 'off', 'LineWidth', 2, 'XTick', [], 'YTick', [], 'FontSize', 15);
|
|
|
+ title( sprintf( '(2) Mask #%04d', frameIdx ));
|
|
|
+ colormap(sp2, 'gray');
|
|
|
+
|
|
|
+ % Overlay
|
|
|
+ overlay = repmat( frame, [1 1 3] );
|
|
|
+ overlay(:,:,1) = 0.5*mask';
|
|
|
+
|
|
|
+ sp3 = subplot(2,2,3); hold off
|
|
|
+ imagesc( overlay );
|
|
|
+ set(gca, 'Box', 'off', 'LineWidth', 2, 'XTick', [], 'YTick', [], 'FontSize', 15);
|
|
|
+ title( sprintf( '(3) Overlay #%04d', frameIdx ));
|
|
|
+
|
|
|
+ %% Extracting image statistics using regionprops
|
|
|
+ mask_binary = mask > probability_threshold;
|
|
|
+ stats = regionprops( mask_binary', 'BoundingBox', 'Area', 'Centroid', 'Orientation' );
|
|
|
+
|
|
|
+ probability_threshold = 0.5; % Probability, anonymous unit (0-1)
|
|
|
+ size_threshold = 100; % Pixel
|
|
|
+ drawing_regionprops = false;
|
|
|
+
|
|
|
+ big_enough = find( [stats.Area]>size_threshold );
|
|
|
+ if ~isempty( big_enough )
|
|
|
+ stat = stats(big_enough);
|
|
|
+ xy(:,frameIdx) = stat.Centroid;
|
|
|
+ bb(:,frameIdx) = stat.BoundingBox;
|
|
|
+ else % if failed
|
|
|
+ xy(:,frameIdx) = xy(:,frameIdx-1);
|
|
|
+ bb(:,frameIdx) = bb(:,frameIdx-1);
|
|
|
+ end
|
|
|
+
|
|
|
+ sp4 = subplot(2,2,4); hold off
|
|
|
+ imagesc( frame );
|
|
|
+ set(gca, 'Box', 'off', 'LineWidth', 2, 'XTick', [], 'YTick', [], 'FontSize', 15);
|
|
|
+ title( sprintf( '(4) Tracking result #%04d', frameIdx ));
|
|
|
+ colormap(sp4,'gray');
|
|
|
+ hold on;
|
|
|
+ % Centroid
|
|
|
+ plot( xy(1,frameIdx), xy(2,frameIdx), 'g*', 'MarkerSize', 20);
|
|
|
+ % BoundingBox
|
|
|
+ rectangle('Position', bb(:,frameIdx),'EdgeColor','g','LineWidth',2 )
|
|
|
+ % Text annotation
|
|
|
+ text_contents = sprintf( 'X: [%.1f], Y: [%.1f]', xy(:,frameIdx));
|
|
|
+ text( xy(1,frameIdx),xy(2,frameIdx) - 50, text_contents, 'Color', 'g',...
|
|
|
+ 'HorizontalAlignment', 'center' );
|
|
|
+
|
|
|
+ %% Etc.
|
|
|
+ drawnow;
|
|
|
+
|
|
|
+ % Writing output video
|
|
|
+ if output_video_option
|
|
|
+ if frameIdx==1
|
|
|
+ try vid_obj.close(); clear vid_obj; end
|
|
|
+ vid_obj = VideoWriter( [output_video_directory ...
|
|
|
+ video_names(videoIdx).name '.mp4'], 'MPEG-4');
|
|
|
+ vid_obj.open();
|
|
|
+ end
|
|
|
+ capture_frame = getframe(gcf);
|
|
|
+ vid_obj.writeVideo(capture_frame.cdata);
|
|
|
+ if frameIdx==length( frame_names )
|
|
|
+ vid_obj.close();
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+end
|