首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用按钮停止while循环

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

Stack Overflow用户
提问于 2017-02-25 00:02:07
回答 1查看 199关注 0票数 2

我正在尝试创建一个GUI控制程序,旨在处理从显微镜摄像机获取的实时流,它应该识别流中用户定义的对象的形状,计算它们的边缘和中心,并将它们叠加到流上,有效地跟踪对象。这已经很好地工作了,我想继续,但是我有一个问题,我就是不能中断正在进行帧处理的while循环。我希望能够做到这一点,因为可能有很好的理由在很久之后中止跟踪过程。这个想法是只有一个按钮,该按钮将在循环的每次迭代中检查的标志更改为false,并使用它完成,但它不起作用。

在网上搜索,我发现这似乎是一个回调队列相关的问题。只要循环正在运行,用于更改中断标志的按钮的按下就不会被注册,我通过在其回调中插入断点进行了测试,即使单击该按钮也不会触发断点。在某些情况下,解决方案建议使用drawnow暂时停止循环并处理任何排队的回调,但这似乎没有任何作用。我还检查了按钮和图像(需要单击才能开始跟踪)的InterruptibleBusyAction属性是否分别设置为Onqueue。他们是,但事实仍然是,我不能中断这个循环。

如上所述,当点击axes对象中的livestream时,跟踪开始。代码如下:

代码语言:javascript
复制
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

setappdatagetappdata函数用于使多个数据对整个程序可用,它们的存在是有原因的。videoObject的声明、图形用户界面的初始化等等都是在trackerGUI_OpeningFcn中进行的,如果需要,我当然也可以发布。

我尝试用于循环终止的按钮的代码如下所示

代码语言:javascript
复制
function pushbutton1_Callback(hObject, eventdata, handles)
% disable tracking state
setappdata(handles.figure1, 'tracker', 0);
guidata(hObject, handles);
drawnow

正如我所说的,跟踪工作正常(尽管只有大约2帧/秒,可能会更高),我只是不能中断它。有趣的是,可能出于同样的原因,其他一些东西也不能很好地工作:我的图形用户界面中有一个滑块,用于设置要在模式识别功能中使用的fudgefactor。如果我在跟踪处于活动状态时更改它,则可以立即在流/覆盖图中看到更改后的fudgefactor效果,但是只要循环运行,应该显示当前选定因子的文本字段就不会更新。如果不是,它会立即更新。

EN

回答 1

Stack Overflow用户

发布于 2017-02-25 05:11:35

我第一次没有完全读完这个问题。此外,我试图发表评论,但我没有这样的声誉。

为什么你不尝试在句柄中初始化跟踪器

代码语言:javascript
复制
handles.tracker = 1;

在gui加载代码中,然后使用

代码语言:javascript
复制
while handles.tracker

在停止跟踪按钮中,让您的回调执行handles.tracker = 0;

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42443079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档