Hi,
I'm trying to display a video before and after my processing algorithm simultaneously in a GUI. I load the video frame by frame, display one frame in one axes, do the processing, and display the result frame in another axes. So I need to switch between the two axes.
I used axes(handles.original), axes(handles.result) to switch, but it tells me axes() in a loop is rather slow and it is slow. Then I used image(f,'Parent', handles.original); image(g,'Parent', handles.result) to switch, but it doesn't work well --- only the last frame will be displayed. Is there any faster way to correctly display the video?
Many thanks,
Peter
|
|
0
|
|
|
|
Reply
|
Peter
|
9/16/2010 12:37:04 AM |
|
Peter:
Look at my rhino movie demo below. I do the same thing and it plays
at virtually real time. In a loop, I load a frame, calculate the mean
in red, green, and blue, then switch over to another axes to plot the
mean from the start of the movie up until the current frame, and then
go back to the movie axis to repeat until all frames are processed.
Now, I don't know how extensive your image analysis is for each frame,
but like I said, for me it's really fast. IMPORTANT: THE NEWSREADER
WILL SPLIT SOME LONG LINES INTO TWO. YOU WILL HAVE TO REJOIN THESE
LINES TO FIX THE SYNTAX ERRORS.
-ImageAnalyst
% Demo macro to extract frames and get frame means from an avi movie
% and save individual frames to separate image files.
% Also computes the mean gray value of the color channels.
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
imtool close all; % Close all imtool figures.
clear; % Erase all existing variables.
workspace; % Make sure the workspace panel is showing.
fontSize = 14;
% Change the current folder to the folder of this m-file.
% (The line of code below is from Brett Shoelson of The Mathworks.)
if(~isdeployed)
cd(fileparts(which(mfilename)));
end
% Open the rhino.avi demo movie that ships with MATLAB.
movieFullFileName = 'C:\Program Files\MATLAB\R2010a\toolbox\images
\imdemos\rhinos.avi';
% Check to see that it exists.
if ~exist(movieFullFileName, 'file')
strErrorMessage = sprintf('File not found:\n%s\nYou can choose a new
one, or cancel', movieFullFileName);
response = questdlg(strErrorMessage, 'File not found', 'OK - choose a
new movie.', 'Cancel', 'OK - choose a new movie.');
if strcmpi(response, 'OK - choose a new movie.')
[baseFileName, folderName, FilterIndex] = uigetfile('*.avi');
if ~isequal(baseFileName, 0)
movieFullFileName = fullfile(folderName, baseFileName);
else
return;
end
else
return;
end
end
try
mov = aviread(movieFullFileName);
% movie(mov);
% Determine how many frames there are.
numberOfFrames = size(mov, 2);
numberOfFramesWritten = 0;
% Prepare a figure to show the images in the upper half of the
screen.
figure;
screenSize = get(0, 'ScreenSize');
newWindowPosition = [1 screenSize(4)/2 - 70 screenSize(3)
screenSize(4)/2];
set(gcf, 'Position', newWindowPosition); % Maximize figure.
% set(gcf, 'Position', get(0,'Screensize')); % Maximize figure.
% Ask user if they want to write the individual frames out to
disk.
promptMessage = sprintf('Do you want to save the individual frames
out to individual disk files?');
button = questdlg(promptMessage, 'Save individual frames?', 'Yes',
'No', 'Yes');
if strcmp(button, 'Yes')
writeToDisk = true;
% Extract out the various parts of the filename.
[folder, baseFileName, extentions, version] =
fileparts(movieFullFileName);
% Make up a special new output subfolder for all the separate
% movie frames that we're going to extract and save to disk.
% (Don't worry - windows can handle forward slashes in the
folder name.)
folder = pwd; % Make it a subfolder of the folder where this
m-file lives.
outputFolder = sprintf('%s/Movie Frames from %s', folder,
baseFileName);
% Create the folder if it doesn't exist already.
if ~exist(outputFolder, 'dir')
mkdir(outputFolder);
end
else
writeToDisk = false;
end
% Loop through the movie, writing all frames out.
% Each frame will be in a separate file with unique name.
meanGrayLevels = zeros(numberOfFrames, 1);
meanRedLevels = zeros(numberOfFrames, 1);
meanGreenLevels = zeros(numberOfFrames, 1);
meanBlueLevels = zeros(numberOfFrames, 1);
for frame = 1 : numberOfFrames
% Extract the frame from the movie structure.
thisFrame = mov(frame).cdata;
% Display it
hImage = subplot(1,2,1);
image(thisFrame);
axis square;
caption = sprintf('Frame %4d of %d.', frame, numberOfFrames);
title(caption, 'FontSize', fontSize);
drawnow; % Force it to refresh the window.
% Write the image array to the output file, if requested.
if writeToDisk
% Construct an output image file name.
outputBaseFileName = sprintf('Frame %4.4d.png', frame);
outputFullFileName = fullfile(outputFolder,
outputBaseFileName);
% Stamp the name and frame number onto the image.
% At this point it's just going into the overlay,
% not actually getting written into the pixel values.
text(5, 15, outputBaseFileName, 'FontSize', 20);
% Extract the image with the text "burned into" it.
frameWithText = getframe(gca);
% frameWithText.cdata is the image with the text
% actually written into the pixel values.
% Write it out to disk.
imwrite(frameWithText.cdata, outputFullFileName, 'png');
end
% Calculate the mean gray level.
grayImage = rgb2gray(thisFrame);
meanGrayLevels(frame) = mean(grayImage(:));
% Calculate the mean R, G, and B levels.
meanRedLevels(frame) = mean(mean(thisFrame(:, :, 1)));
meanGreenLevels(frame) = mean(mean(thisFrame(:, :, 2)));
meanBlueLevels(frame) = mean(mean(thisFrame(:, :, 3)));
% Plot the mean gray levels.
hPlot = subplot(1,2,2);
hold off;
plot(meanGrayLevels, 'k-', 'LineWidth', 2);
hold on;
plot(meanRedLevels, 'r-');
plot(meanGreenLevels, 'g-');
plot(meanBlueLevels, 'b-');
% Put title back because plot() erases the existing title.
title('Mean Gray Levels', 'FontSize', fontSize);
if frame == 1
xlabel('Frame Number');
yLabel('Gray Level');
% Get size data later for preallocation if we read
% the movie back in from disk.
[rows columns numberOfColorChannels] = size(thisFrame);
end
% Update user with the progress. Display in the command
window.
if writeToDisk
progressIndication = sprintf('Wrote frame %4d of %d.', frame,
numberOfFrames);
else
progressIndication = sprintf('Processed frame %4d of %d.',
frame, numberOfFrames);
end
disp(progressIndication);
% Increment frame count (should eventually = numberOfFrames
% unless an error happens).
numberOfFramesWritten = numberOfFramesWritten + 1;
end
% Alert user that we're done.
if writeToDisk
finishedMessage = sprintf('Done! It wrote %d frames to folder
\n"%s"', numberOfFramesWritten, outputFolder);
else
finishedMessage = sprintf('Done! It processed %d frames of
\n"%s"', numberOfFramesWritten, movieFullFileName);
end
disp(finishedMessage); % Write to command window.
uiwait(msgbox(finishedMessage)); % Also pop up a message box.
% Exit if they didn't write any individual frames out to disk.
if ~writeToDisk
return;
end
% Ask user if they want to read the individual frames from the
disk,
% that they just wrote out, back into a movie and display it.
promptMessage = sprintf('Do you want to recall the individual
frames\nback from disk into a movie?\n(This will take several
seconds.)');
button = questdlg(promptMessage, 'Recall Movie?', 'Yes', 'No',
'Yes');
if strcmp(button, 'No')
return;
end
% Read the frame back in, and convert them to a movie.
% I don't know of any way to preallocate recalledMovie.
for frame = 1 : numberOfFrames
% Construct an output image file name.
outputBaseFileName = sprintf('Frame %4.4d.png', frame);
outputFullFileName = fullfile(outputFolder,
outputBaseFileName);
% Read the image in from disk.
thisFrame = imread(outputFullFileName);
% Convert the image into a "movie frame" structure.
recalledMovie(frame) = im2frame(thisFrame);
end
% Get rid of old image and plot.
delete(hImage);
delete(hPlot);
% Create new axes for our movie.
subPlot(1, 3, 2);
axis off; % Turn off axes numbers.
title('Movie recalled from disk', 'FontSize', fontSize);
% Play the movie in the axes.
movie(recalledMovie);
% Note: if you want to display graphics or text in the overlay
% as the movie plays back then you need to do it like I did at
first
% (at the top of this file where you extract and imshow a frame at
a time.)
msgbox('Done with this demo!');
catch ME
% Some error happened if you get here.
stError = lasterror;
strErrorMessage = sprintf('Error extracting movie frames from:\n\n%s\n
\nError: %s\n\n)', movieFullFileName, stError.message);
msgboxw(strErrorMessage);
end
|
|
0
|
|
|
|
Reply
|
imageanalyst (7590)
|
9/16/2010 12:50:46 AM
|
|
Thank you! I learned to use drawnow from your example, and it works now!
image(f,'Parent', handles.original); % display the original frame in the original axes
drawnow; % force the image to show up
image(g,'Parent', handles.result) % display the result frame in the result axes
drawnow; % force the image to show up
Peter
ImageAnalyst <imageanalyst@mailinator.com> wrote in message <d65cfa52-7fc9-47d3-afd0-e0f86607d53b@t7g2000vbj.googlegroups.com>...
> Peter:
> Look at my rhino movie demo below. I do the same thing and it plays
> at virtually real time. In a loop, I load a frame, calculate the mean
> in red, green, and blue, then switch over to another axes to plot the
> mean from the start of the movie up until the current frame, and then
> go back to the movie axis to repeat until all frames are processed.
> Now, I don't know how extensive your image analysis is for each frame,
> but like I said, for me it's really fast. IMPORTANT: THE NEWSREADER
> WILL SPLIT SOME LONG LINES INTO TWO. YOU WILL HAVE TO REJOIN THESE
> LINES TO FIX THE SYNTAX ERRORS.
> -ImageAnalyst
>
> % Demo macro to extract frames and get frame means from an avi movie
> % and save individual frames to separate image files.
> % Also computes the mean gray value of the color channels.
> clc; % Clear the command window.
> close all; % Close all figures (except those of imtool.)
> imtool close all; % Close all imtool figures.
> clear; % Erase all existing variables.
> workspace; % Make sure the workspace panel is showing.
> fontSize = 14;
>
> % Change the current folder to the folder of this m-file.
> % (The line of code below is from Brett Shoelson of The Mathworks.)
> if(~isdeployed)
> cd(fileparts(which(mfilename)));
> end
>
> % Open the rhino.avi demo movie that ships with MATLAB.
> movieFullFileName = 'C:\Program Files\MATLAB\R2010a\toolbox\images
> \imdemos\rhinos.avi';
> % Check to see that it exists.
> if ~exist(movieFullFileName, 'file')
> strErrorMessage = sprintf('File not found:\n%s\nYou can choose a new
> one, or cancel', movieFullFileName);
> response = questdlg(strErrorMessage, 'File not found', 'OK - choose a
> new movie.', 'Cancel', 'OK - choose a new movie.');
> if strcmpi(response, 'OK - choose a new movie.')
> [baseFileName, folderName, FilterIndex] = uigetfile('*.avi');
> if ~isequal(baseFileName, 0)
> movieFullFileName = fullfile(folderName, baseFileName);
> else
> return;
> end
> else
> return;
> end
> end
>
> try
> mov = aviread(movieFullFileName);
> % movie(mov);
> % Determine how many frames there are.
> numberOfFrames = size(mov, 2);
> numberOfFramesWritten = 0;
> % Prepare a figure to show the images in the upper half of the
> screen.
> figure;
> screenSize = get(0, 'ScreenSize');
> newWindowPosition = [1 screenSize(4)/2 - 70 screenSize(3)
> screenSize(4)/2];
> set(gcf, 'Position', newWindowPosition); % Maximize figure.
> % set(gcf, 'Position', get(0,'Screensize')); % Maximize figure.
>
> % Ask user if they want to write the individual frames out to
> disk.
> promptMessage = sprintf('Do you want to save the individual frames
> out to individual disk files?');
> button = questdlg(promptMessage, 'Save individual frames?', 'Yes',
> 'No', 'Yes');
> if strcmp(button, 'Yes')
> writeToDisk = true;
>
> % Extract out the various parts of the filename.
> [folder, baseFileName, extentions, version] =
> fileparts(movieFullFileName);
> % Make up a special new output subfolder for all the separate
> % movie frames that we're going to extract and save to disk.
> % (Don't worry - windows can handle forward slashes in the
> folder name.)
> folder = pwd; % Make it a subfolder of the folder where this
> m-file lives.
> outputFolder = sprintf('%s/Movie Frames from %s', folder,
> baseFileName);
> % Create the folder if it doesn't exist already.
> if ~exist(outputFolder, 'dir')
> mkdir(outputFolder);
> end
> else
> writeToDisk = false;
> end
>
> % Loop through the movie, writing all frames out.
> % Each frame will be in a separate file with unique name.
> meanGrayLevels = zeros(numberOfFrames, 1);
> meanRedLevels = zeros(numberOfFrames, 1);
> meanGreenLevels = zeros(numberOfFrames, 1);
> meanBlueLevels = zeros(numberOfFrames, 1);
> for frame = 1 : numberOfFrames
> % Extract the frame from the movie structure.
> thisFrame = mov(frame).cdata;
>
> % Display it
> hImage = subplot(1,2,1);
> image(thisFrame);
> axis square;
> caption = sprintf('Frame %4d of %d.', frame, numberOfFrames);
> title(caption, 'FontSize', fontSize);
> drawnow; % Force it to refresh the window.
>
> % Write the image array to the output file, if requested.
> if writeToDisk
> % Construct an output image file name.
> outputBaseFileName = sprintf('Frame %4.4d.png', frame);
> outputFullFileName = fullfile(outputFolder,
> outputBaseFileName);
>
> % Stamp the name and frame number onto the image.
> % At this point it's just going into the overlay,
> % not actually getting written into the pixel values.
> text(5, 15, outputBaseFileName, 'FontSize', 20);
>
> % Extract the image with the text "burned into" it.
> frameWithText = getframe(gca);
> % frameWithText.cdata is the image with the text
> % actually written into the pixel values.
> % Write it out to disk.
> imwrite(frameWithText.cdata, outputFullFileName, 'png');
> end
>
> % Calculate the mean gray level.
> grayImage = rgb2gray(thisFrame);
> meanGrayLevels(frame) = mean(grayImage(:));
>
> % Calculate the mean R, G, and B levels.
> meanRedLevels(frame) = mean(mean(thisFrame(:, :, 1)));
> meanGreenLevels(frame) = mean(mean(thisFrame(:, :, 2)));
> meanBlueLevels(frame) = mean(mean(thisFrame(:, :, 3)));
>
> % Plot the mean gray levels.
> hPlot = subplot(1,2,2);
> hold off;
> plot(meanGrayLevels, 'k-', 'LineWidth', 2);
> hold on;
> plot(meanRedLevels, 'r-');
> plot(meanGreenLevels, 'g-');
> plot(meanBlueLevels, 'b-');
>
> % Put title back because plot() erases the existing title.
> title('Mean Gray Levels', 'FontSize', fontSize);
> if frame == 1
> xlabel('Frame Number');
> yLabel('Gray Level');
> % Get size data later for preallocation if we read
> % the movie back in from disk.
> [rows columns numberOfColorChannels] = size(thisFrame);
> end
>
> % Update user with the progress. Display in the command
> window.
> if writeToDisk
> progressIndication = sprintf('Wrote frame %4d of %d.', frame,
> numberOfFrames);
> else
> progressIndication = sprintf('Processed frame %4d of %d.',
> frame, numberOfFrames);
> end
> disp(progressIndication);
> % Increment frame count (should eventually = numberOfFrames
> % unless an error happens).
> numberOfFramesWritten = numberOfFramesWritten + 1;
> end
>
> % Alert user that we're done.
> if writeToDisk
> finishedMessage = sprintf('Done! It wrote %d frames to folder
> \n"%s"', numberOfFramesWritten, outputFolder);
> else
> finishedMessage = sprintf('Done! It processed %d frames of
> \n"%s"', numberOfFramesWritten, movieFullFileName);
> end
> disp(finishedMessage); % Write to command window.
> uiwait(msgbox(finishedMessage)); % Also pop up a message box.
>
> % Exit if they didn't write any individual frames out to disk.
> if ~writeToDisk
> return;
> end
>
> % Ask user if they want to read the individual frames from the
> disk,
> % that they just wrote out, back into a movie and display it.
> promptMessage = sprintf('Do you want to recall the individual
> frames\nback from disk into a movie?\n(This will take several
> seconds.)');
> button = questdlg(promptMessage, 'Recall Movie?', 'Yes', 'No',
> 'Yes');
> if strcmp(button, 'No')
> return;
> end
>
> % Read the frame back in, and convert them to a movie.
> % I don't know of any way to preallocate recalledMovie.
> for frame = 1 : numberOfFrames
> % Construct an output image file name.
> outputBaseFileName = sprintf('Frame %4.4d.png', frame);
> outputFullFileName = fullfile(outputFolder,
> outputBaseFileName);
> % Read the image in from disk.
> thisFrame = imread(outputFullFileName);
> % Convert the image into a "movie frame" structure.
> recalledMovie(frame) = im2frame(thisFrame);
> end
> % Get rid of old image and plot.
> delete(hImage);
> delete(hPlot);
> % Create new axes for our movie.
> subPlot(1, 3, 2);
> axis off; % Turn off axes numbers.
> title('Movie recalled from disk', 'FontSize', fontSize);
> % Play the movie in the axes.
> movie(recalledMovie);
> % Note: if you want to display graphics or text in the overlay
> % as the movie plays back then you need to do it like I did at
> first
> % (at the top of this file where you extract and imshow a frame at
> a time.)
> msgbox('Done with this demo!');
>
> catch ME
> % Some error happened if you get here.
> stError = lasterror;
> strErrorMessage = sprintf('Error extracting movie frames from:\n\n%s\n
> \nError: %s\n\n)', movieFullFileName, stError.message);
> msgboxw(strErrorMessage);
> end
>
>
|
|
0
|
|
|
|
Reply
|
Peter
|
9/16/2010 1:06:04 AM
|
|
|
2 Replies
788 Views
(page loaded in 0.062 seconds)
Similiar Articles: display video in a GUI - comp.soft-sys.matlabHi, I'm trying to display a video before and after my processing algorithm simultaneously in a GUI. I load the video frame by frame, display one fr... how to embed video in custom gui - comp.soft-sys.matlabhello i want to display video in my custom gui.so how can i embed video in my custom gui....is it necessary to use simulink only ...no other way ..... Display result in GUI - comp.soft-sys.matlabdisplay video in a GUI - comp.soft-sys.matlab Display result in GUI - comp.soft-sys.matlab display video in a GUI - comp.soft-sys.matlab Display result in GUI - comp.soft ... How to display the result of a cell array in GUI - comp.soft-sys ...How do I display the results in a nice format in my GUI? Something like Study A Study B Study C UpperLimit 100 105 200 ... How to play .avi in gui axes? - comp.soft-sys.matlabdisplay video in a GUI - comp.soft-sys.matlab How to play .avi in gui axes? - comp.soft-sys.matlab display video in a GUI - comp.soft-sys.matlab... display a clock in a gui matlab in textbox? - comp.soft-sys.matlab ...display video in a GUI - comp.soft-sys.matlab display a clock in a gui matlab in textbox? - comp.soft-sys.matlab ... OpenGL display of data processed in real time in ... how to access the webcam from gui using matlab? - comp.soft-sys ...display video in a GUI - comp.soft-sys.matlab how to access the webcam from gui using matlab? - comp.soft-sys ..... monitoring system" .In this ,i am going to track the ... Matlab GUI: displaying a Transfer Function in a static text box ...display video in a GUI - comp.soft-sys.matlab Matlab GUI: displaying a Transfer Function in a static text box ..... GUI - comp.soft-sys.matlab... of a static-text function ... Embed Command Window in GUI - comp.soft-sys.matlabdisplay video in a GUI - comp.soft-sys.matlab... channels. clc; % Clear the command window ... in my custom gui.so how can i embed video in my custom gui ... get frame ... Excel, GUI - comp.soft-sys.matlabhow to embed video in custom gui - comp.soft-sys.matlab hello i want to display video in my custom gui.so how can i embed video in my custom gui....is it necessary to use ... display video in a GUI - Newsreader - MATLAB CentralHi, I'm trying to display a video before and after my processing algorithm simultaneously in a GUI. I load the video frame by frame, display one frame in one axes, do ... Graphical user interface - Wikipedia, the free encyclopediaIn computing, a graphical user interface (GUI, commonly pronounced gooey) is a type of ... Heads-up display in video games; Icon; Infobar; Label; Loading screen; Progress bar 7/22/2012 3:32:23 PM
|