Matlab App Designer中如何终止摄像头采集的无限循环
解决方案
问题根源
- 原代码的while循环未添加
drawnow刷新UI事件队列,导致Stop按钮的回调函数始终无法被触发执行 - webcam对象、停止控制变量为局部/全局变量,App不同回调之间无法安全共享状态
- 额外创建figure的控制逻辑冗余且不稳定
修改步骤
- 新增App共享属性:将摄像头对象、停止标志位存入公共属性,方便不同回调调用
properties (Access = public) UIFigure matlab.ui.Figure StopButton matlab.ui.control.Button EmpezarButton matlab.ui.control.Button UIAxes matlab.ui.control.UIAxes micamara webcam % 新增:存储摄像头对象 stop_flag logical = false % 新增:停止采集标志位 end
- 修改Empezar按钮回调:增加停止标志判断、UI刷新语句,循环结束后自动释放摄像头资源
% Button pushed function: EmpezarButton function EmpezarButtonPushed(app, event) % 重置停止标志,避免上次运行状态影响 app.stop_flag = false; % 初始化摄像头,先清理之前残留的摄像头对象 if ~isempty(app.micamara) && isvalid(app.micamara) clear(app.micamara) end app.micamara = webcam(1); app.micamara.Resolution = '640x360'; app.micamara.Brightness = 10; % 采集循环 while ~app.stop_flag img = snapshot(app.micamara); imshow(img, 'Parent', app.UIAxes); drawnow % 核心:刷新UI事件队列,让Stop按钮的回调可以被触发 end % 循环结束后释放摄像头资源 clear(app.micamara) app.micamara = []; end
- 修改Stop按钮回调:仅需修改停止标志位即可终止采集循环
% Button pushed function: StopButton function StopButtonPushed(app, event) app.stop_flag = true; end
注意事项
- 不要在App Designer回调中使用
clear all,会清空App对象的所有属性 - 不要用全局变量传递状态,所有共享状态存储在App的properties中更安全
- 所有阻塞循环必须添加
drawnow,否则UI交互事件会被阻塞无法触发
内容的提问来源于stack exchange,提问作者engineerinprocess
相关产品推荐
相关产品推荐

