主要内容

执行图像采集和并行图像处理

此示例显示了如何并行地执行从网络摄像头和后处理数据的图像获取。

在本例中,MATLAB客户端从视频设备中获取帧,然后将后处理工作卸载给并行工作人员,后者使用去噪神经网络从每帧中过滤掉噪声。然后这些帧被写入视频。

在本例中,使用Parfeval.在工人和工人上进行后处理parallel.pool.Constant将去噪网络实例化到要在后处理过程中使用的worker中。为了从工作人员那里发回帧并确保它们是按顺序写的,这个例子使用了OrderedDataQueue.对象。

提取设备信息并设置视频输出

清除先前的图像采集对象并提取当前连接到机器的视频设备的信息。

对象= imaqfind;删除(对象);imaqreset;DeviceInfo = IMAQHWINFO(“winvideo”的)
DeviceInfo =结构体字段:AdaptorDllName: ' adapter .dll' AdaptorDllVersion: '6.1 (R2019b)' AdaptorName: 'winvideo' DeviceIDs: {[1]} DeviceInfo: [1×1 struct]

检查当前目录中是否存在输出视频的文件夹。如果没有输出视频文件夹,则创建一个。

如果~ isfolder ('导出目录')MKDIR.OutputFolder结尾

要将视频数据写入输出文件夹中的AVI文件,请创建videoWriter.对象。

Videoout = VideoWriter('outputfolder / myvideo.avi');

设置并行环境

要使后处理能够卸载给工作人员,首先启动一个并行池。

p = parpool('当地的');
使用“local”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:6)。

创建一个parallel.pool.Constant对象仅在工人中仅创建一个去噪网络并使用它来过滤从帧中的噪声。

C = parallel.pool.Constant(@() denoisingNetwork())'dncnn'));

要将后期处理的帧从工作人员那里发回并按顺序写入,使用OrderedDataQueue..通过使用设置回调以将帧写入磁盘afterEach

q = OrderedDataQueue;sulteAp(q,@(帧)writevideo(视频,帧));

OrderedDataQueue.对象在本示例的支持文件中定义。金宝app如果您想在自己的代码中使用它,复制它并将其与其他文件放在一起。

设置视频输入对象

创建一个视频输入对象。在客户端逐帧设置要执行采集的对象。

VideoIn = VideoInput(“winvideo”,1,'yuy2_800x600'的)
视频输入对象使用“Microsoft®LifecamCinema(TM)”摘要。采集源:INPUT1可用。采集参数:'输入1'是当前所选的源。每个触发器使用所选源10帧。'YUY2_800X600'在开始时要记录的视频数据。首先抓住每1帧。将数据记录到触发器上的“内存”。触发参数:启动时1'立即'触发器。状态:等待开始。自开始以来获取0帧。 0 frames available for GETDATA.
videoIn。ReturnedColorSpace =“RGB”;videoIn。FramesPerTrigger =正;videoIn。FramesAcquiredFcnCount = 1;

设置视频写入帧速率与视频读取帧速率一致,打开视频输出对象。

SRC = VideoIn.Source;视频输出.Frameate = str2double(src.framerate);打开(视频);

在获取每个帧后启动后处理操作,定义aFramesAcquiredFcn回调视频输入对象并开始采集。

videoIn。FramesAcquiredFcn = {@postProcessAndWrite C Q};开始(videoIn);

创建预览窗口。一旦通过使用手动关闭预览,您就可以停止视频等待在图形手柄上hpreviewfig.对于本例,在2秒后停止视频采集。

hPreviewImg =预览(videoIn);hPreviewFig =祖先(hPreviewImg,“图”);暂停(2);停止(视频);

的函数中存储一个将来的变量用户数据视频对象的属性。此变量表示视频写入操作的未来执行。在将所有数据写入输出文件后关闭视频写入器,使用毕竟在这个未来的变量上。

postprocessfutures = VideoIn.Userdata;特写菲律擦= whereall(后处理文件,@()关闭(videoout),0);

本例中的后处理操作可能需要几分钟。Windows 10使用Intel®Xeon®W-2133的6核3.60 GHz CPU,后处理时间为4分钟。

您可以使用助服务栏来跟踪PostProcessing进度。在每个后处理操作后更新维护栏完成,使用afterEach.在所有操作完成后关闭备线,使用毕竟.有关更多信息,请参阅使用afterEach和afterAll异步更新用户界面

h = waitbar (0,“后处理…”);updateWaitbarFuture = afterEach (postProcessFutures,......@(〜)waitbar(sum(strcmp(“完成”, {postProcessFutures.State})) /元素个数(postProcessFutures), h), 1);毕竟(closeVideoFuture @()关闭(h), 0);

在客户端会话中块执行,直到通过等待未来变量来写入完成。

等待(closeVideoFuture);

完成后删除视频输入对象。

删除(videoIn);

可视化结果

创建视频文件后,您可以查看创建结果。

使用一个VideoReader对象读取视频文件。

vidObj = VideoReader ('outputfolder / myvideo.avi');

通过使用读取一些框架readFrame功能。

图像=单元格(1,5);时代= .4:.4:2;为了ii = 1:numel(times)CurrentTime = * (ii);{二}= readFrame图像(vidObj);结尾

要使框架形象化,请使用剪辑功能。

蒙太奇(图片,“大小”,[1 5])

定义辅助函数

定义主要的后处理程序,在每帧采集后执行。这个函数postProcessAndWrite从视频输入对象和调用中获取数据Parfeval.在并行工作者中开始框架去噪。

函数postProcessAndWrite(videoIn,~,C,Q) [frame,~,metadata] = getdata(videoIn,1);postProcessFuture = parfeval (@postProcess 0框架,C, Q, metadata.FrameNumber);videoIn。用户数据= [videoIn.UserData postProcessFuture];结尾

定义在工作者中执行的后处理函数。对于此示例,要简化计算,将每个帧转换为灰色,然后通过使用该帧来欺骗它denoiseImage功能。功能后期过程取帧和去噪网络对象存储在价值田野parallel.pool.Constant对象作为输入。有关具有去噪神经网络的识别图像的更多信息,请参阅获取预制图像去噪网络(图像处理工具箱)

函数后处理(帧,c,q,framenumber)grayframe = im2double(rgb2gray(帧));denoisedgrayframe = denoiseimage(灰色框架,c.value);denoisedgrayframe = im2uint8(denoisedgrayframe);发送(q,framenumber,denoisedgrayframe)结尾

也可以看看

||(图像采集工具箱)|(图像采集工具箱)|(图像采集工具箱)||||(图像处理工具箱)

相关例子

更多关于