Matlab 无法使用按钮停止while循环

Matlab 无法使用按钮停止while循环,matlab,while-loop,interrupt,Matlab,While Loop,Interrupt,我正在尝试创建一个GUI控制的程序,用于处理从显微镜摄像头获取的实时流,它应该能够识别流中用户定义对象的形状,计算它们的边缘和中心,并将其覆盖到流上,实际上是跟踪对象。这已经很好地工作了,我想继续,但是我遇到了一个问题,我无法中断正在进行帧处理的while循环。我希望能够做到这一点,因为可能有很好的理由在很久以后中止跟踪过程。我们的想法是只需要一个按钮,将循环每次迭代时检查的标志更改为false,然后用它完成,只是它不起作用 搜索网络时,我发现这似乎是一个回调队列相关的问题。只要循环在运行,用于

我正在尝试创建一个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')不工作?我想这是一样的,只是标志分别保存在句柄和图形中。我错过什么了吗?