Matlab 无法使用按钮停止while循环
我正在尝试创建一个GUI控制的程序,用于处理从显微镜摄像头获取的实时流,它应该能够识别流中用户定义对象的形状,计算它们的边缘和中心,并将其覆盖到流上,实际上是跟踪对象。这已经很好地工作了,我想继续,但是我遇到了一个问题,我无法中断正在进行帧处理的while循环。我希望能够做到这一点,因为可能有很好的理由在很久以后中止跟踪过程。我们的想法是只需要一个按钮,将循环每次迭代时检查的标志更改为false,然后用它完成,只是它不起作用 搜索网络时,我发现这似乎是一个回调队列相关的问题。只要循环在运行,用于更改中断标志的按钮的按下就不会被注册,我通过在其回调中插入中断点进行了测试,即使单击了按钮,也不会触发该回调。有几次,解决方案建议使用Matlab 无法使用按钮停止while循环,matlab,while-loop,interrupt,Matlab,While Loop,Interrupt,我正在尝试创建一个GUI控制的程序,用于处理从显微镜摄像头获取的实时流,它应该能够识别流中用户定义对象的形状,计算它们的边缘和中心,并将其覆盖到流上,实际上是跟踪对象。这已经很好地工作了,我想继续,但是我遇到了一个问题,我无法中断正在进行帧处理的while循环。我希望能够做到这一点,因为可能有很好的理由在很久以后中止跟踪过程。我们的想法是只需要一个按钮,将循环每次迭代时检查的标志更改为false,然后用它完成,只是它不起作用 搜索网络时,我发现这似乎是一个回调队列相关的问题。只要循环在运行,用于
drawnow
临时停止循环并处理任何排队的回调,但这似乎没有任何作用。我还检查了按钮的interruptable
和BusyAction
属性和图像(需要单击以开始跟踪)是否分别设置为on
和queue
。是的,但事实是我不能打断这个循环
如上所述,当单击Axis对象中的livestream
时,跟踪开始。其代码如下:
function ImageClickCallback(hObject, eventData, handles)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%--------- Selection of object to monitor --------%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% get handle to the axes object the stream is displayed in
axesHandle = get(hObject,'Parent');
% get coordinates of mouseclick and store them in a struct
coordinates = get(axesHandle,'CurrentPoint');
coordinates = coordinates(1,1:2);
% save those coordinates in the figure's appdata for further usage
setappdata(handles.figure1,'ccoordx',coordinates(1));
setappdata(handles.figure1,'ccoordy',coordinates(2));
% overlay marker onto video stream
hold on
scatter(coordinates(1),coordinates(2),400,'r','x', 'LineWidth', 2 );
hold off
% Display x and y values in textboxes
set(handles.text2, 'String', getappdata(handles.figure1, 'ccoordx'));
set(handles.text3, 'String', getappdata(handles.figure1, 'ccoordy'));
% enable tracking state
setappdata(handles.figure1, 'tracker', 1);
drawnow
set(findobj(gca,'BusyAction', 'cancel'), 'Interruptible', 'On');
tracker=getappdata(handles.figure1, 'tracker');
stream=getappdata(handles.figure1, 'stream');
while tracker == 1
% get currently displayed frame and convert to grayscale
singleframe=getsnapshot(stream);
% run the ObjectFinder and save the result, objectfinder is a self-programmed function thats doing the object-recognition
[alphamask, center, errorcode] = objectFinder(singleframe, getappdata(handles.figure1, 'ccoordx'), getappdata(handles.figure1,'ccoordy'), handles);
% abort if user clicked a non-object area
if errorcode == 2
msgbox('Not a valid object.');
return
end
% add alphamask to green picture to create overlay on axes1
hold on
set(findobj(gca,'BusyAction', 'cancel'), 'AlphaData', alphamask);
hold off
% update x and y coordinates of chosen object to its current
% center of mass
setappdata(handles.figure1,'ccoordx',center(1,1));
setappdata(handles.figure1,'ccoordy',center(1,2));
% make center of mass visible
set(findobj(gca,'Type','scatter'), 'XData', center(1,1));
set(findobj(gca,'Type','scatter'), 'YData', center(1,2));
flushdata(stream);
set(findobj(gca,'BusyAction', 'cancel'), 'Interruptible', 'On');
% this is where the condition is checked
tracker=getappdata(handles.figure1, 'tracker');
drawnow
end
% this part is supposed to delete the overlay when the loop is terminated
% by the button push
hold on
delete(findobj(gca,'Type', 'Scatter'));
set(findobj(gca,'BusyAction', 'cancel'), 'AlphaData', 0);
hold off
drawnow
setappdata
和getappdata
函数用于使多条数据可供整个程序使用,它们的存在是有原因的。videoObject
的声明、GUI的初始化等都发生在trackerGUI\u OpeningFcn
中,如果有人要求,我当然也可以发布
我试图用于循环终止的按钮的代码如下
function pushbutton1_Callback(hObject, eventdata, handles)
% disable tracking state
setappdata(handles.figure1, 'tracker', 0);
guidata(hObject, handles);
drawnow
正如我所说,跟踪效果很好(虽然只有大约2帧/秒,这可能会更高),我只是不能中断它。有趣的是,有些东西也不太管用,可能是出于同样的原因:我的GUI中有一个滑块,它设置了一个
fudgefactor
,用于模式识别功能。如果在跟踪处于活动状态时对其进行更改,则可以立即在流/覆盖中看到更改的fudgefactor
效果,但只要循环运行,就不会更新本应显示当前选定因子的文本字段。如果不是,它会立即更新。我第一次没有完全阅读这个问题。此外,我试图发表评论,但我没有这样的声誉
为什么不尝试用初始化句柄中的跟踪器
handles.tracker = 1;
在gui中加载代码,然后使用
while handles.tracker
在停止跟踪的按钮中,让您的回调执行
handles.tracker=0代码>我第一次没有完全阅读这个问题。此外,我试图发表评论,但我没有这样的声誉
为什么不尝试用初始化句柄中的跟踪器
handles.tracker = 1;
在gui中加载代码,然后使用
while handles.tracker
在停止跟踪的按钮中,让您的回调执行handles.tracker=0代码>尝试使用切换按钮,让while循环检查切换的状态,以决定是否中断循环。1。尝试将drawnow
替换为pause(0.001)
。2.移除while循环,并验证按下按钮时是否执行了按钮1\u回调。3.您使用的是什么版本的Matlab和OS?您可以使用多线程代码并行执行多个作业(因此,当您的循环运行时,gui的其他部分正在工作)。创建一个全局变量并将其用作while循环中的标志,然后为gui创建另一个线程并尝试使用button@Rotem我使用的是Windows10和MatlabR2016a。我不必访问Matlab和我的atm程序,但我将在周一尝试实现这些更改。还有,我真的不知道如何做你建议的事情——我如何明确地并行运行事情?如果需要并行处理工具箱:我没有。请尝试使用切换按钮,让while循环检查切换的状态,以决定是否中断循环。1。尝试将drawnow
替换为pause(0.001)
。2.移除while循环,并验证按下按钮时是否执行了按钮1\u回调。3.您使用的是什么版本的Matlab和OS?您可以使用多线程代码并行执行多个作业(因此,当您的循环运行时,gui的其他部分正在工作)。创建一个全局变量并将其用作while循环中的标志,然后为gui创建另一个线程并尝试使用button@Rotem我使用的是Windows10和MatlabR2016a。我不必访问Matlab和我的atm程序,但我将在周一尝试实现这些更改。还有,我真的不知道如何做你建议的事情——我如何明确地并行运行事情?如果需要并行处理工具箱:我没有。我将在周一尝试,但是有没有理由handles.tracker应该工作,而set/getappdata(handles.figure1'tracker')不工作?我想这是一样的,只是标志分别保存在句柄和图形中。我遗漏了什么吗?我将在周一尝试,但是有没有理由handles.tracker应该工作,而set/getappdata(handles.figure1'tracker')不工作?我想这是一样的,只是标志分别保存在句柄和图形中。我错过什么了吗?