并行执行图像采集和图像处理
这个例子展示了如何执行从一个网络摄像头和图像采集后处理数据并行。
在这个例子中,MATLAB客户机获得帧的视频设备,然后就减少了后处理平行工人,滤出噪声从每一帧使用神经网络去噪。然后写进一个视频帧。
在本例中,您使用parfeval
执行人员和后处理parallel.pool.Constant
实例化去噪网络的工人在使用后处理。发送帧从工人和确保他们都写在订单,这个示例使用了一个OrderedDataQueue
对象。
提取设备信息和设置视频输出
清楚之前的图像采集对象和提取信息目前视频设备连接到机器。
对象= imaqfind;删除(对象);imaqreset;deviceInfo = imaqhwinfo (“winvideo”)
deviceInfo =结构体字段:AdaptorDllName:“适配器。dll的AdaptorDllVersion: 6.1 (R2019b)”AdaptorName:“winvideo”的deviceid: {[1]} DeviceInfo: [1×1 struct]
检查输出视频的文件夹已经存在于当前目录。如果输出视频文件夹不存在,创建一个。
如果~ isfolder (“OutputFolder”mkdir)OutputFolder结束
视频数据写入一个AVI文件在输出文件夹中,创建一个VideoWriter
对象。
videoOut = VideoWriter (“OutputFolder / myVideo.avi”);
设置并行环境
使卸载后加工的工人,开始一个平行的池。
p = parpool (“本地”);
开始平行池(parpool)使用“本地”概要文件…连接到平行池(工人数量:6)。
创建一个parallel.pool.Constant
对象创建一个网络只有一次去噪的工人和用它来过滤噪声帧。
C = parallel.pool.Constant (@ () denoisingNetwork (“dncnn”));
发送位帧从工人和写他们,使用一个OrderedDataQueue
。设置回调写磁盘使用的帧afterEach
。
Q = OrderedDataQueue;afterEach (Q, @(帧)writeVideo (videoOut帧));
的OrderedDataQueue
对象是定义在一个支持文件这个例子。万博1manbetx如果你想在自己的代码中使用它,复制,并将其与你的文件。
设置视频输入对象
创建一个视频输入对象。设置对象执行采集客户端逐帧。
videoIn = videoinput (“winvideo”,1“YUY2_800x600”)
总结视频输入对象使用的Microsoft®LifeCam电影院(TM)”。采集源(s): input1可用。采集参数:“input1”是当前选中的源。10帧/触发使用选定的来源。“YUY2_800x600”视频数据被记录在开始。首先抓住每帧(s)。日志数据触发“记忆”。触发参数:1“立即”触发(s)开始。状态:等待开始。0帧开始以来获得的。 0 frames available for GETDATA.
videoIn。ReturnedColorSpace =“RGB”;videoIn。FramesPerTrigger =正;videoIn。FramesAcquiredFcnCount = 1;
设置视频帧速率写入视频一样的速度阅读,并打开视频输出对象。
src = videoIn.Source;videoOut。帧速率= str2double (src.FrameRate);打开(videoOut);
每一帧后开始后处理操作,定义一个FramesAcquiredFcn
回调视频输入对象,开始收购。
videoIn。FramesAcquiredFcn = {@postProcessAndWrite C Q};开始(videoIn);
创建一个预览窗口。你可以尽快停止视频预览由使用手动关闭等待
图上的处理hPreviewFig
。对于这个示例,停止视频采集后2秒。
hPreviewImg =预览(videoIn);hPreviewFig =祖先(hPreviewImg,“图”);暂停(2);停止(videoIn);
后处理功能存储未来的变量用户数据
视频对象的属性。这个变量代表了未来视频写操作的执行。关闭视频作者的所有数据后写入输出文件,使用毕竟
在这未来的变量。
postProcessFutures = videoIn.UserData;closeVideoFuture =毕竟(postProcessFutures, @ () (videoOut), 0);
后处理操作在本例中是可以花几分钟。在Windows 10,英特尔®3.60 GHz Xeon®w - 2133 CPU, 6芯,后处理花了4分钟。
您可以使用一个waitbar追踪后处理的进步。更新waitbar每个后处理操作完成后,使用afterEach
。关闭waitbar所有操作完成后,使用毕竟
。有关更多信息,请参见使用afterEach和毕竟异步更新用户界面。
h = waitbar (0,“后处理…”);updateWaitbarFuture = afterEach (postProcessFutures,…@ (~)waitbar(总和(strcmp (“完成”,{postProcessFutures.State})) /元素个数(postProcessFutures), h), 1);毕竟(closeVideoFuture @()关闭(h), 0);
阻止客户端会话中执行,直到写完,等待未来的变量。
等待(closeVideoFuture);
删除完成后视频输入对象。
删除(videoIn);
可视化的结果
创建视频文件后,您可以可视化的结果。
使用一个VideoReader
对象读取视频文件。
vidObj = VideoReader (“OutputFolder / MyVideo.avi”);
通过读一些帧readFrame
函数。
图像=细胞(1、5);* =。4:.4:2;为2 = 1:元素个数vidObj(次)。CurrentTime = * (ii);{二}= readFrame图像(vidObj);结束
可视化框架,使用蒙太奇
函数。
蒙太奇(图片,“大小”[1 5])
定义辅助函数
定义主要的后处理程序,每一帧收购后执行。这个函数postProcessAndWrite
获取视频输入的数据对象和调用parfeval
开始并行工作的框架去噪。
函数postProcessAndWrite (videoIn ~ C, Q)(框架、~、元数据)= getdata (videoIn, 1);postProcessFuture = parfeval (@postProcess 0框架,C, Q, metadata.FrameNumber);videoIn。用户数据= [videoIn.UserData postProcessFuture];结束
定义要执行的后处理功能的工人。在这个例子中,为了简化计算,将每一帧转换为灰色,然后通过使用降噪denoiseImage
函数。这个函数后处理
需要框架和去噪网络对象中存储价值
场的parallel.pool.Constant
对象作为输入。更多信息在神经网络去噪图像的去噪,明白了网络得到Pretrained图像去噪(图像处理工具箱)。
函数后处理(帧,C, Q, frameNumber) grayFrame = im2double (rgb2gray(帧));denoisedGrayFrame = denoiseImage (grayFrame C.Value);denoisedGrayFrame = im2uint8 (denoisedGrayFrame);发送(Q, frameNumber denoisedGrayFrame)结束
另请参阅
parfeval
|parallel.pool.Constant
|imaqfind
(图像采集工具箱)|videoinput
(图像采集工具箱)|FramesAcquiredFcn
(图像采集工具箱)|VideoWriter
|毕竟
|afterEach
|denoiseImage
(图像处理工具箱)
相关的例子
更多关于
- 开始使用图像处理工具箱(图像处理工具箱)
- 开始使用图像采集工具(图像采集工具箱)