How to stop the while loop when using imrect() draw many rectangles in an image?

1 view (last 30 days)
I use the while loop to enable me extract many rectangle areas of an image by imrect function, and I want to stop the loop when I input the "Enter" from the keyboard. The thing is it won't stop the drawing immediately after I enter the button but until the next draw. How should I avoid this??? Thanks so much! The code is below:
function [ImgPatch_Cluster,ShowMask] = seletpatch()
%%%this function is to let users crop any image patches
temp=imread('./train images/1.png');
OrigImg=rgb2gray(temp);
fprintf('Start to crop the image patches from the whole image.\n');
imgSz = size(OrigImg);
PatchCount = 0;
ImgPatch_Cluster = cell(1,1);
FLAG = 1;
ShowMask = uint8(mat2gray(OrigImg)*255);
global KEY_IS_PRESSED
KEY_IS_PRESSED = 0;
figure('KeyPressFcn', @myKeyPressFcn);
imshow(OrigImg,'Border','tight');
fprintf('If you want to stop selecting on the current image.\n');
fprintf('Press "Enter" button, then drag any size rectangle to finish.\n');
while KEY_IS_PRESSED == 0
% set(gcf, 'KeyPressFcn', @myKeyPressFcn);
if KEY_IS_PRESSED==1
break;
end
H = imrect;
if KEY_IS_PRESSED==1
fprintf('Finish selecting on the current image.\n Drag any size rectangle to finish.\n');
break;
else
position = wait(H);
setColor(H,[1 0 0]);
xmin = round(position(1));
ymin = round(position(2));
width = position(3);
height = position(4);
xmax = xmin+width-1;
ymax = ymin+height-1;
if xmin<=0
xmin = 1;
end
if ymin<=0
ymin = 1;
end
if xmax>=imgSz(2)
xmax = imgSz(2)-1;
end
if ymax>=imgSz(1)
ymax = imgSz(1)-1;
end
new_width = xmax-xmin+1;
new_height = ymax-ymin+1;
if mod(new_width,2)==0
new_width = new_width+1;
end
if mod(new_height,2)==0
new_height = new_height+1;
end
ImgPatch = zeros(new_height,new_width);
ImgPatch(1:new_height,1:new_width) = ...
OrigImg(ymin:ymin+new_height-1,xmin:xmin+new_width-1);
BinaryMask = zeros(imgSz(1),imgSz(2));
BinaryMask(ymin:ymin+new_height-1,xmin:xmin+new_width-1) = 1;
BinaryContour = bwmorph(BinaryMask,'remove');
BinaryContour = imdilate(BinaryContour,ones(5));
ShowMask(BinaryContour) = 255;
% contour(BinaryMask*2-1,[0 0],'r');
% api = iptgetapi(H);
% position = api.getPosition();
PatchCount = PatchCount+1;
ImgPatch_Cluster{1,PatchCount} = ImgPatch;
end
end
hold off;
close;
function myKeyPressFcn(hObject, event)
global KEY_IS_PRESSED
if strcmp(event.Key,'return')
KEY_IS_PRESSED = 1;
end

Answers (1)

Image Analyst
Image Analyst on 7 Mar 2013
Why not just put code like this at the end of the loop:
message = sprintf('Do you want to continue saving rectangular regions?');
reply = questdlg(message, 'Continue with Loop?', 'OK','Cancel', 'OK');
if strcmpi(reply, 'Cancel')
% User canceled so exit.
break;
end
  2 Comments
Han Li
Han Li on 8 Mar 2013
Thanks for your advice. It sounds great, but generally, the user has to input around 10 rectangles at the same time. It will be a little noisy though since it
Image Analyst
Image Analyst on 8 Mar 2013
So? If you just go as fast as you can until the user hits a key then how do you have any control at all over how many rectangles are created? It would be almost random. Why is my method a little noisy?

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!