MatlabGUI:如果多次单击,则包含imrect的回调将被卡住

MatlabGUI:如果多次单击,则包含imrect的回调将被卡住,matlab,user-interface,Matlab,User Interface,我正在用Matlab编写一个GUI,用户可以在其中处理图像。打开图像后,用户可以通过下面的裁剪按钮回调代码指定ROI。种植后,可以进行进一步的分析 除了用户在没有选择矩形的情况下意外单击“裁剪”按钮外,所有操作都正常。然后,再次单击按钮,我可以绘制矩形,但不再确认我的选择。我认为前面的回调仍然停留在waith函数上,该函数应该允许用户根据需要重新定义矩形 我还尝试包含一个重启按钮并重新打开GUI,但是仍然无法在图像中选择ROI % --- Executes on button press in

我正在用Matlab编写一个GUI,用户可以在其中处理图像。打开图像后,用户可以通过下面的裁剪按钮回调代码指定ROI。种植后,可以进行进一步的分析

除了用户在没有选择矩形的情况下意外单击“裁剪”按钮外,所有操作都正常。然后,再次单击按钮,我可以绘制矩形,但不再确认我的选择。我认为前面的回调仍然停留在waith函数上,该函数应该允许用户根据需要重新定义矩形

我还尝试包含一个重启按钮并重新打开GUI,但是仍然无法在图像中选择ROI

% --- Executes on button press in cropButton.
function cropButton_Callback(hObject, eventdata, handles)

% Read image
I = handles.I;
hold(handles.axes1,'on');

% Let user choose rectangle to crop
h = imrect(handles.axes1);
position = round(wait(h));
% Crop image
I = imcrop(I,position);

hold(handles.axes1,'off');

% Show cropped image
imshow(I, 'Parent', handles.axes1);

handles.I = I;
guidata(hObject, handles);

% --- Executes on button press in resetButton.
function resetButton_Callback(hObject, eventdata, handles)
clear all;
close all;
clc;
MyGUI; % restart GUI

我怎样才能解决这个问题?如果您有任何想法,我们将不胜感激。

您可以使用findobj来查找矩形,即hggroup对象,而不是重置按钮。如果未找到矩形,即未选择矩形就按下了裁剪按钮,请调用“返回”,然后再次执行

例如:

另一个选项是使用某种标志来知道是否执行了某个回调。您可以将这些标志存储在GUI的句柄结构中,以便可以从任何回调访问它们

例如,假设您声明

handles.SelectRectangleFlag = true;
guidata(hObject,handles);
选择矩形后。然后,当您按下裁剪按钮时,您可以检查标志的值,如果它为false,请不要忘记在开始时初始化它,然后返回,不要执行任何操作

例如,在克罗布顿

if handles.SelectRectangleFlag == false
msgbox('Please select a rectangle before pressing the Crop button');
    return
end

希望有帮助!我希望这足够清楚。如果没有,请询问:

您可以在单击时禁用该按钮,并在回调结束时重新启用该按钮:

% --- Executes on button press in cropButton.
function cropButton_Callback(hObject, eventdata, handles)
set(handles.cropButton,'enable','off');

% Read image
I = handles.I;
hold(handles.axes1,'on');

% Let user choose rectangle to crop
h = imrect(handles.axes1);
position = round(wait(h));
% Crop image
I = imcrop(I,position);

hold(handles.axes1,'off');

% Show cropped image
imshow(I, 'Parent', handles.axes1);

handles.I = I;
guidata(hObject, handles);
set(handles.cropButton,'enable','on');

简单多了。

谢谢您的快速回复。我会尝试一下,让你知道它是否有效:我喜欢这种方法。我有很多按钮,其他人也使用imrect功能。是否有可能一次禁用所有按钮?另一个问题:如果用户决定不进行裁剪(如终止回调),是否可以取消选择裁剪按钮?抱歉,响应太晚。据我所知,没有内置的“禁用所有按钮”功能。您可以通过循环集调用禁用它们,可以作为单独的包装函数,也可以在代码主体中禁用。根据你有多少个按钮,建立要传递的对象句柄数组可能会变得相当乏味,但我相信有一些聪明的方法可以减少这项工作。
% --- Executes on button press in cropButton.
function cropButton_Callback(hObject, eventdata, handles)
set(handles.cropButton,'enable','off');

% Read image
I = handles.I;
hold(handles.axes1,'on');

% Let user choose rectangle to crop
h = imrect(handles.axes1);
position = round(wait(h));
% Crop image
I = imcrop(I,position);

hold(handles.axes1,'off');

% Show cropped image
imshow(I, 'Parent', handles.axes1);

handles.I = I;
guidata(hObject, handles);
set(handles.cropButton,'enable','on');