Suppose we have the following for
loop:
for i=1:100
% image processing calculation
% show image to the user and ask for his rating
rating(i) = input('Enter rating of the shown image\n');
end
Obviously, the input
command will wait for the user input and the for
loop won't continue until the user has provided his input. The image processing code I'm running in the for
loop is time consuming so I'd like to know if there's a way to make MATLAB continue calculations - in the background - for the following loop iteration while waiting for the user's input.
This is the idea I mentioned in my comment.
num_im = 3; % Number of images
% Initialize
rating = zeros(num_im,1);
fig = zeros(num_im,1);
txt = zeros(num_im,1);
% Main loop
for i = 1:num_im
% image processing calculation
pause(1); % a dummy calculation
% Open a figure
fig(i) = figure('Name', ['Image #' num2str(i)],...
'CloseRequestFcn', [... % read the text edit
'temp = str2double(get(txt(' num2str(i) '), ''String'')); ',...
'if isnan(temp), errordlg(''Please enter the rating.''); ',... % Error if invalid
'else, rating(' num2str(i) ') = temp; delete(fig(' num2str(i) ')); end']);
subplot(2,1,1, 'position', [0 0.5 1 0.5]);
% Show your image
[im, map] = imread('trees.tif');
imshow(im, map);
% Text edit
txt(i) = uicontrol('Units','Normalized',...
'Style','edit',...
'Position', [0.3 0.2 0.4 0.2]);
end
Make sure to click somewhere else after you enter the ratings so that the text box
detects your input.
It will store all the ratings in rating
matrix.
However this does not limit the number of open figures. Refer to the Edit if you want to limit them.
To limit the number of opened figures. I suggest you to put all the images after calculation in a Queue and set a timer to ask the user rating in the background until all the ratings are asked.
num_im = 4; % Number of images
max_num_figs = 2; % maximum number of open figures
% Initialize
rating = zeros(num_im,1);
fig = zeros(num_im,1);
txt = zeros(num_im,1);
show_idx = 0; % Number of shown images
Calc_idx = 0; % Number of images in Queue
num_open_figs = 0; % number of open figures
Queue = cell(num_im, 1);
% Main loop
% Start a timer for asking the user rating in background
tmr = timer('ExecutionMode', 'fixedRate',...
'Period', 0.5, 'TimerFcn', 'tmr_callback');
start(tmr);
for k = 1:num_im
% image processing calculation
pause(1); % a dummy calculation
% Put the image and its data into a Queue ith
[im, map] = imread('trees.tif');
Queue{Calc_idx+1} = {im, map};
Calc_idx = Calc_idx + 1;
end
% Create a GUI if there is any unshown images in the Queue
% and if open figures are less than maximum number of figures
if show_idx < Calc_idx && num_open_figs < max_num_figs
num_open_figs = num_open_figs + 1;
show_idx = show_idx + 1; % Number of shown images
% Open a figure
fig(show_idx) = figure('Name', ['Image #' num2str(show_idx)],...
'CloseRequestFcn', [...
'temp = str2double(get(txt(' num2str(show_idx) '), ''String'')); ',... % Read the text edit
'if isnan(temp), errordlg(''Please enter the rating.''); ',... % Error if invalid
'else, rating(' num2str(show_idx) ') = temp; delete(fig(' num2str(show_idx) ')); ',...
'num_open_figs = num_open_figs - 1; end']);
subplot(2,1,1, 'position', [0 0.5 1 0.5]);
imshow(Queue{show_idx}{:});
% Text edit
txt(show_idx) = uicontrol('Units','Normalized',...
'Style','edit',...
'Position', [0.3 0.2 0.4 0.2]);
% turn off the timer if all ratings are asked.
if (show_idx == num_im)
stop(tmr);
end
end
I also suggest to write the data(rating) into a file after the user enters each of them. You can use dlmwrite
for example.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With