You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab App Designer中如何终止摄像头采集的无限循环

解决方案

问题根源

  • 原代码的while循环未添加drawnow刷新UI事件队列,导致Stop按钮的回调函数始终无法被触发执行
  • webcam对象、停止控制变量为局部/全局变量,App不同回调之间无法安全共享状态
  • 额外创建figure的控制逻辑冗余且不稳定

修改步骤

  1. 新增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
  1. 修改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
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:06:08