如何保存和预览帧从videoinput同时生活吗?(GUI + GigE相机)

8视图(30天)
大家好!
我工作在一个GUI应用程序监控3 d打印机。应用程序必须显示现场的3 d印刷过程,而每一帧GigE相机是在给定目录中保存为一个图像。这些监控会话可以从1分钟到几乎120个小时!(也可以配置监控会话的延迟supponsing一些小维护必须完成实际开始之前3 d打印机打印)。我用一条尖吻鲭g - 131 GigE相机和我的代码示例的基础结构” myCameraGUI.m “提供 由MathWorks支持小组万博1manbetx
此刻,在我OpeningFcn宣布videoinput立即触发。预览功能允许用户看到现场图像的视频输入。
函数myCameraGUI_OpeningFcn (hObject eventdata处理,变长度输入宗量)
%这个函数没有输出参数,看到OutputFcn。
% hObject图的句柄
% eventdata保留——MATLAB的未来版本中定义
%处理结构处理和用户数据(见GUIDATA)
mycameragui %变长度输入宗量命令行参数(见变长度输入宗量)
%为mycameragui选择默认命令行输出
句柄。输出= hObject;
句柄。视频= videoinput (“gentl”,1“Mono8”);
集(handles.video,“TimerPeriod”,0.05,
“TimerFcn”,(“如果(~ isempty (gco)),
'处理= guidata (gcf);“%更新处理
图像(getsnapshot (handles.video)),“%得到图片使用GETSNAPSHOT和把它放到轴使用的形象
“集(handles.cameraAxes,“ytick”, [],“xtick”, []),“%去除tickmarks和标签使用图像时插入
“其他”
“删除”(imaqfind);%清理,删除任何图像采集对象
“结束”]);
%立即触发函数——ocurrs自动后立即开始
triggerconfig (handles.video“立即”);
%显示视频应用程序启动
轴(处理。cameraAxes);
vidRes = handles.video.VideoResolution;
nBands = handles.video.NumberOfBands;
hImage =图像(0 (vidRes (2), vidRes (1) nBands));
% setappdata (hImage UpdatePreviewWindowFcn, @mypreview_fcn);
预览(处理。视频中,hImage);
%设置默认FPS最大——防止错误之前运行
camera_info = getselectedsource (handles.video);
camera_info。AcquisitionFrameRateAbs = camera_info.AcquisitionFrameRateLimit;
%向用户显示当前信息采集
集(handles.edit7,“字符串”,camera_info.DeviceTemperature);
集(handles.edit9,“字符串”,camera_info.AcquisitionFrameRateAbs);
%的颜色开始收购用绿色按钮
集(handles.startAcquisition,“写成BackgroundColor”,‘g’);
%更新处理结构
guidata (hObject处理);
% UIWAIT使mycameragui等待用户响应(见UIRESUME)
uiwait (handles.myCameraGUI);
到目前为止一切都按计划进行。然而,当我单击startAcquisition按钮两种情形发生(如果我使用不同函数“drawnow”或“imgshow(数据)”)。如果我使用“drawnow”功能后保存的图像“imwrite”函数,那么cameraAxes将不断更新(根据需要),但是保存的图像只会出现在整个收购完成后的文件夹位置。
另一方面,如果我使用“imgshow(数据)保存后的图像“imwrite”功能,然后cameraAxes将停止更新…但是保存的图像会出现,因为他们正在创建的文件夹位置。
% - - - - - -执行在startAcquisition按钮按下。
函数startAcquisition_Callback (hObject eventdata处理)
% hObject句柄startAcquisition(见GCBO)
% eventdata保留——MATLAB的未来版本中定义
%处理结构处理和用户数据(见GUIDATA)
%恢复对象的视频
running_camera = getselectedsource (handles.video);
轴(handles.cameraAxes);
%恢复全局变量——从用户从文本字段
全球高清md hr fps na可视数据太阳先生
resultInputData = verifyInputFormat (hObject、eventdata处理);
%这个函数检查输入格式的文本字段
如果(resultInputData ~ = 0)
%收购启动/停止按钮被按下
如果比较字符串(get (handles.startAcquisition,“字符串”),“Iniciar Adquisicion”)
%小反馈用户让他知道程序正在运行
集(handles.startAcquisition,“写成BackgroundColor”,“b”);
集(handles.startAcquisition,“字符串”,“En Espera”);
暂停(1);
%等到延迟由用户配置
hr_enSegundos =人力资源* 60 * 60;
mr_enSegundos = * 60先生;
tiempoDeRetraso = hr_enSegundos + mr_enSegundos;
暂停(tiempoDeRetraso);
%一旦延迟完成收购按钮的颜色变化
集(handles.startAcquisition,“写成BackgroundColor”,“r”);
集(handles.startAcquisition,“字符串”,“Detener Adquisicion”);
集(handles.edit1,“启用”,“关闭”);
集(handles.edit2,“启用”,“关闭”);
集(handles.edit3,“启用”,“关闭”);
集(handles.edit4,“启用”,“关闭”);
集(handles.edit5,“启用”,“关闭”);
集(handles.edit6,“启用”,“关闭”);
集(handles.edit8,“启用”,“关闭”);
集(handles.saveRoute,“启用”,“关闭”);
%恢复监控会话的时间
hd_enSegundos =高清* 60 * 60;
md_enSegundos = md * 60;
tiempoDeGrabacion = hd_enSegundos + md_enSegundos;
%和帧持续时间转换为秒
framesDeGrabacion = tiempoDeGrabacion * fps;
%捕获所有帧在1秒之内
handles.video。FramesPerTrigger = fps;
%设置根据用户输入fps
running_camera。AcquisitionFrameRateAbs = fps;
%触发器将执行尽可能多的(秒1)用户设定的时间
handles.video。TriggerRepeat = framesDeGrabacion-1;
%更新GUI上的用户信息
集(handles.edit9,“字符串”,running_camera.AcquisitionFrameRateAbs);
集(handles.edit7,“字符串”,running_camera.DeviceTemperature);
%开始照相机
开始(handles.video)
i = 1;
(正在(handles.video))
(handles.video。FramesAvailable > = 1)
data = getdata (handles.video, 1);
numDeImagen = num2str(我);
nomImagen = strcat(太阳,“\”na numDeImagen,“jpg”);
nomImagenString = num2str (nomImagen);
imwrite(数据(::,:,1),nomImagenString);
我=我+ 1;
*%更新cameraAxes
imshow(数据);
% drawnow %不工作! *
如果我> framesDeGrabacion
停止(handles.video);
结束
结束
结束
%自然习得的结束
saveAndFinishRoutine (hObject eventdata、处理);
其他的
%如果收购由用户停止
saveAndFinishRoutine (hObject eventdata、处理);
结束
结束
所以,如果任何人都可以请告诉我一个更好的方法来保存和预览帧同时. .这将是可怕的。
以下两个图片从我的应用程序屏幕截图在点击按钮之后StartAcquisition时刻。正如您可以看到的,现场与第一帧图像轴冻结。然而,数据在保存的图像是基于摄像机成功更新记录。
开始收购后:
小前60秒过去了。
任何帮助将不胜感激。
5个评论

登录置评。

接受的答案

Bego
Bego 2016年9月27日
尽管好的想法是提供的Geoff,我所做的是改变方法来解决我的问题。后开始阅读我了解到()函数并不是那样异步认为. .在stead this function is similar to a while() loop since it takes ownership of the execution if a proper trigger is configured. So, what I did was to re-write my startAcquisition_Callback() so that:
handles.video。FramesPerTrigger = fps;
% fps是一个变量得到从用户的界面
%这个变量意味着帧每秒
handles.video。TriggerRepeat = monitoringTimeInSeconds-1;
% monitoringTimeInSeconds是我从用户得到一个变量
%这个变量是小时和分钟的总和转换为秒
handles.video。FramesAcquiredFcnCount = 1;
%这个指定一个接一个帧将被收购
集(handles.video,“FramesAcquiredFcn”,@display_frame);
%这display_frame将指定函数
%负责管理一个传入的帧。
开始(handles.video);
然后,在我display_frame我照顾帧一个接一个函数:
%检索框架
imageData = getdata (obj, 1);
%画出每一帧
drawnow;
%保存帧图像
imageNumber = num2str (imgCount);
imwrite (imageData strcat (saveRoute,“\照片”imageNumber,“jpg”));
imgCount = imgCount + 1;
这种方法的好处,一旦所有帧捕获指定(handles.video一旦条件。TriggerRepeat = monitoringTimeInSeconds-1满足)的视频对象将自动停止(类似于一个停止(handles.video)。
是的!由于这些变化我现在能够配置监控会话变量FPS的不断更新,实时显示图像文件几乎没有延迟的出现在所需的文件夹位置。
正确的! (* 自己在空中击掌):)
1评论
安迪·斯科特·加西亚戈迪略
编辑:安迪·斯科特·加西亚戈迪略 2021年4月14日
你好 @Bego 同样,我一直挣扎在这个问题有一段时间了。我想写一个图形界面来控制显微镜相机以及其他设备连接在一起。像一个星期前我发现这个线程,我意识到这将解决所有问题;我还没有发现任何东西都在web。请,你会给我整个代码让我更好地理解如何解决你的问题?它也将是很大的帮助使用一个GUI代码模板。你可以在这里联系我:a.s.garciagordillo@gmail.com。谢谢你!安迪加西亚。

登录置评。

更多的答案(0)

社区寻宝

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

开始狩猎!