你怎么能阻止视频直播在GUI吗?

10视图(30天)
乔纳森•奥尼尔
乔纳森•奥尼尔 2014年9月3日
评论道: 杰夫•海斯 2014年9月5日
你好,我有代码显示相机拍摄的视频在一个GUI。我无法停止这种视频一旦它开始,我复制的代码图像显示告诉用户关闭图像只需点击“x”按钮在右上角。这里的问题是,一旦不可见的“x”框图片在我的GUI运行。
最尝试忽略或matlab冻结原因/挂。我相信一个循环运行当我试着关闭视频,它只是忽略关闭请求。
disp (“iCam生活模式预览”)
PrepareAcquisition ()
%初始化系统
disp (“初始化摄像头”);
ret = AndorInitialize ();
CheckError (ret);
disp (“配置采集”);
(ret) = CoolerON ();%打开温度凉爽
CheckWarning (ret);
(ret) = SetAcquisitionMode (5);%设置收购模式;5等
CheckWarning (ret);
(ret) = SetExposureTime (0.02);%设置曝光时间排在第二
CheckWarning (ret);
(ret) = SetReadMode (4);%设置阅读模式;4的图像
CheckWarning (ret);
(ret) = SetTriggerMode (10);%设置软件触发模式
useSoftwareTrigger = true;
如果ret = = atmcd.DRV_INVALID_TRIGGER_MODE
disp (软件触发不可用,使用内部触发相反的)
SetTriggerMode (0);%设置内部触发模式
useSoftwareTrigger = false;
结束
CheckWarning (ret);
(ret) = SetShutter (1, - 1, 0, 0);%打开快门
CheckWarning (ret);
[ret, XPixels YPixels] = GetDetector;%得到CCD尺寸
CheckWarning (ret);
(ret) = SetImage (XPixels 1, 1, 1, 1, YPixels);%设置图像大小
CheckWarning (ret);
disp (“开始收购”);
(ret) = StartAcquisition ();
CheckWarning (ret);
我= 0 (YPixels XPixels);
h =显示亮度图像(I);
colormap(灰色);
warndlg (“中止收购关闭图像显示。,“开始收购”);
(get (0,“CurrentFigure”))
如果useSoftwareTrigger = = true
(ret) = SendSoftwareTrigger ();
CheckWarning (ret);
(ret) = WaitForAcquisition ();
CheckWarning (ret);
结束
[ret, imageData] = GetMostRecentImage (XPixels * YPixels);
CheckWarning (ret);
如果ret = = atmcd.DRV_SUCCESS
%显示获得的图像
我= flipdim(转置(重塑(imageData、XPixels YPixels)), 1);
集(h,CData的,我);
drawnow;
结束
结束
disp (“收购完成!清理和关闭的);
(ret) = AbortAcquisition;
CheckWarning (ret);
(ret) = SetShutter (1、2、1、1);
CheckWarning (ret);
(ret) = AndorShutDown;
CheckWarning (ret);
我试着使用这段代码的最后6或7行作为一个单独的但这发生一次按下“停止”按钮,大部分时间我甚至不能打开主matlab窗口看到由于它挂……
可以有人解释我如何关闭或停止这个视频没有matlab崩溃吗?
谢谢你约翰

接受的答案

杰夫•海斯
杰夫•海斯 2014年9月3日
约翰尼-上面的代码来自哪里?是在一个回调(按钮?)从你的GUI,开始捕捉图像和显示它们的过程在一个图中, h 你的GUI,外?或者(更有可能),你是显示GUI上的图像在一个轴部件——这可以解释为什么没有x按钮关闭。
让我们假设您已经开始按钮,调用上面的代码并启动图像采集,你有一个停止按钮,会阻止这个过程。
这几乎是正确的,当你说自循环运行时,所有其他请求(如按下停止按钮)将被忽略。“几乎”,因为你有一个 drawnow 命令应该允许其他进程中断当前的一个(见 回调测序和中断 详情)。所以按下停止按钮应该允许我们退出 循环如果我们改变一些事情。我假设 可中断 开始按钮的属性 (这是默认设置)。
在上面的代码,只是之前 循环开始添加以下行,改变循环的条件
%创建一个数据字段内说,我们已经开始处理
%图像采集
句柄。imgAcqStarted = 1;
%保存字段处理结构
guidata (hObject处理);
%条件在这个领域
handles.imgAcqStarted = = 1
%得到处理的最新副本
处理= guidata (hObject);
%等
结束
所以我们将继续做直到告诉否则图像采集。我们需要更新的副本 处理 在每个迭代中,因为它是将会更新这个对象的停止按钮,特别是 imgAcqStarted 国旗。在停止按钮的回调
函数stop_Callback (hObject eventdata处理)
流(“试图阻止…\ n”);
%停止图像采集
句柄。imgAcqStarted = 0;
%保存字段处理结构
guidata (hObject处理);
当停止按钮被按下,上面的代码应该被调用。的 imgAcqStarted 现在将是零,当回调的简历, 循环条件应该评估错误,我们将退出循环。
上面的代码应该提供帮助,我们总是调用 drawnow 函数。然而,这并非总是如此,因为它只是时调用 ret = = atmcd.DRV_SUCCESS 。所以我们需要处理的情况下,这不是成功。只是改变这段代码
如果ret = = atmcd.DRV_SUCCESS
%显示获得的图像
我= flipdim(转置(重塑(imageData、XPixels YPixels)), 1);
集(h,CData的,我);
drawnow;
其他的
暂停(0.001);
结束
添加一个短暂停将允许这个回调被打断的停止按钮回调,所以图像采集应该优雅地结束。
一个“问题”,我能想到的是如果用户关闭GUI(点击x)。我们如何指示开始按钮的回调停止?我们可以做一些类似于停止按钮,但它确实有点简单。对于您的GUI /图,创建一个 CloseRequestFcn 回调,并添加以下代码(在这种情况下,我的GUI /图名称(或标签) 图1 )
% - - - - - -当用户试图关闭图1执行。
函数figure1_CloseRequestFcn (hObject eventdata处理)
% hObject处理图1(见GCBO)
% eventdata保留——MATLAB的未来版本中定义
%处理结构处理和用户数据(见GUIDATA)
如果handles.imgAcqStarted = = 1
句柄。imgAcqStarted = 2;
guidata (hObject处理);
其他的
删除(hObject);
结束
在上面的,如果图像采集开始(所以它的整数值是一个),那么我们这个标志设置为两个(这样我们退出while循环)并保存更改 处理 结构。如果图像采集尚未开始,那么我们只是删除图,它将优雅地关闭。
如果更改两个国旗/指标,然后开始按钮回调的简历,将退出 因为这个标志不再是一个循环。收购会更优雅,但我们仍然需要关闭图。添加以下行结束的开始按钮的回调函数
如果handles.imgAcqStarted = = 2
删除(handles.figure1);
结束
这应该然后删除GUI /图,希望没有错误。如果我知道更多关于图像采集工作,我建议用一个计时器,代替上面的一些周期性的火和抓住下一个图像。你仍然可以这样做,但我不确定多久你想获得新的图像和一个计时器是否可以足够快。
试着上面,看看会发生什么!
5个评论

登录置评。

更多的答案(0)

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!