Try this out:
function roiData = testGUI(sourceImage)
% Initialize main figure
hdl.mainfig = figure();
% Initialize roiData and roiCounter
roiData = [];
roiCounter = 0;
% Select Elliptical ROI button
hdl.selectEllipseButton = uicontrol(hdl.mainfig, 'Units', 'normalized', 'Position',[0.05 0.7 0.2 0.1], 'String', 'Select Ellipse', 'Callback', @selectEllipse);
% Select Polygonal ROI button
hdl.selectPolygonButton = uicontrol(hdl.mainfig, 'Units', 'normalized', 'Position',[0.05 0.6 0.2 0.1], 'String', 'Select Polygon', 'Callback', @selectPolygon);
% Abort Button
hdl.abort = uicontrol(hdl.mainfig, 'Units', 'normalized', 'Position',[0.05 0.2 0.2 0.2], 'String', 'Abort', 'Callback', @abort);
% Axes
hdl.axes = axes('Parent',hdl.mainfig, 'Units', 'Normalized', 'Position', [0.35 0.2 0.6 0.6]);
% Callbackrunning parameter
callbackrunning = false;
function selectEllipse(hObject,eventdata)
if(callbackrunning)
return;
end
callbackrunning = true;
imshow(sourceImage, [], 'Parent', hdl.axes);
roiCounter = roiCounter + 1;
h = imellipse(hdl.axes);
if(~callbackrunning)
return;
end
mask = uint16(createMask(h));
roiData(roiCounter).mask = mask;
callbackrunning = false;
end
function selectPolygon(hObject,eventdata)
if(callbackrunning)
return;
end
callbackrunning = true;
imshow(sourceImage, [], 'Parent', hdl.axes);
roiCounter = roiCounter + 1;
h = impoly(hdl.axes);
if(~callbackrunning)
return;
end
mask = uint16(createMask(h));
roiData(roiCounter).mask = mask;
callbackrunning = false;
end
function abort(hObject,eventdata)
if(callbackrunning)
disp('Fire escape key to cancel previous imrect');
% Create robot that fires an escape key
robot = java.awt.Robot;
robot.keyPress (java.awt.event.KeyEvent.VK_ESCAPE);
robot.keyRelease (java.awt.event.KeyEvent.VK_ESCAPE);
callbackrunning = false;
end
end
% Pause until figure is closed
waitfor(hdl.mainfig);
end
The robot object fires the escape key which cancels imrect.