我想从显示的图像中获取矩形坐标。我想要下一步和后面移动图像。这是我的matlab GUI
所以当我按下它时,它应该显示下一个串联的图像,类似的是后退按钮。我正在使用此代码
function next_Callback(hObject, eventdata, handles)
% hObject handle to next (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if handles.mypointer~=length(handles.cur_images)
handles.mypointer=handles.mypointer+1;
pic=imread(fullfile('images',handles.cur_images(handles.mypointer).name));
handles.imageName=handles.cur_images(handles.mypointer).name;
imshow(pic);
h=imrect;
getMyPos(getPosition(h));
addNewPositionCallback(h,@(p) getMyPos(p));
fcn = makeConstrainToRectFcn('imrect',get(gca,'XLim'),get(gca,'YLim'));
setPositionConstraintFcn(h,fcn);
handles.output = hObject;
handles.posi=getPosition(h);
guidata(hObject, handles);
但是这个代码的缺点是当按下下一个按钮然后它停在h=imrect
上,等待用户绘制矩形。如果我不绘制矩形,它什么都不做。即使我再次按下或按下按钮也没有任何作用,因为它仍在等待用户绘制矩形。如果这是一个显而易见的问题,我很抱歉,但我是matlab GUI的新手
的问题:
如何让程序停在Imrect
答案 0 :(得分:0)
很少有人注意到:
imrect
移动到单独的按钮,就像Excaza提到的那样。 imrect
后都是响应式的。 h = imrect(handles.axes1);
而不仅仅是' h = imrect;`(我不知道它是否与您的问题有关)。 当我遇到Matlab"阻塞函数"的问题时,我通过执行定时器对象的回调函数内的函数来解决它。
我不知道这是一个好习惯,它只是我解决它的方式......
在定时器回调内执行一个函数,允许继续执行主程序流程。
以下代码示例演示如何创建计时器对象,并在计时器的回调函数中执行imrect
。
样本创建" SingleShot"定时器,并在执行时间start
功能后触发200毫秒执行的回调。
function timerFcn_Callback(mTimer, ~)
handles = mTimer.UserData;
h = imrect(handles.axes1); %Call imrect(handles.axes1) instead just imrect.
% getMyPos(getPosition(h));
% ...
%Stop and delete the timer (this is not a goot practice to delete timer here - this is just an exampe).
stop(mTimer);
delete(mTimer);
function next_Callback(hObject, eventdata, handles)
% if handles.mypointer~=length(handles.cur_images)
% ...
% h = imrect(handles.axes1);
%Create new "Single Shot" timer (note: it is not a good practice to create new timer each time next_Callback is executed).
t = timer;
t.TimerFcn = @timerFcn_Callback; %Set timer callback function
t.ExecutionMode = 'singleShot'; %Set mode to "singleShot" - execute TimerFcn only once.
t.StartDelay = 0.2; %Wait 200msec from start(t) to executing timerFcn_Callback.
t.UserData = handles; %Set UserData to handles - passing handles structure to the timer.
%Start timer (function timerFcn_Callback will be executed 200msec after calling start(t)).
start(t);
disp('Continue execution...');