主要内容

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

这个例子展示了如何从网络摄像头和后处理数据并行执行图像采集。

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

在本例中,使用parfeval在工人中进行后处理parallel.pool.Constant实例化工人中用于后处理的去噪网络。为了将帧从workers中发送回来并确保它们是按顺序编写的,本示例使用了OrderedDataQueue对象。

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

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

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

检查当前目录中是否已经存在用于输出视频的文件夹。如果不存在用于输出视频的文件夹,请创建一个。

如果~ isfolder (“OutputFolder”mkdir)OutputFolder结束

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

videoOut = VideoWriter(“OutputFolder / myVideo.avi”);

设置并行环境

为了能够将后处理工作卸载给worker,首先启动一个并行池。

P = parpool(“本地”);
使用“本地”配置文件启动并行池(parpool)…连接到并行池(工人数:6)。

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

C = parallel.pool.Constant(@()“dncnn”));

要将后处理的帧从worker中发送回来并按顺序写入,请使用OrderedDataQueue.设置一个回调,通过使用将帧写入磁盘afterEach

Q = OrderedDataQueue;afterEach (Q, @(帧)writeVideo (videoOut帧));

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

设置视频输入对象

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

videoIn = videoinput(“winvideo”, 1“YUY2_800x600”
使用'Microsoft®LifeCam Cinema(TM)'的视频输入对象摘要。采集源:input1可用。采集参数:'input1'是当前选中的源。使用所选源每个触发器10帧。'YUY2_800x600'视频数据开始时要记录。抓取第一个每1帧(s)。在触发时将数据记录到“内存”。触发参数:启动时1个“立即”触发器。状态:等待启动。启动后获得0帧。 0 frames available for GETDATA.
videoIn。ReturnedColorSpace =“RGB”;videoIn。FramesPerTrigger = Inf;videoIn。FramesAcquiredFcnCount = 1;

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

src = videoIn.Source;videoOut。FrameRate = str2double(src.FrameRate);打开(videoOut);

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

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

创建一个预览窗口。你可以手动关闭预览后立即停止视频等待在数字句柄上hPreviewFig.本例中,在2秒后停止视频采集。

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

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

postProcessFutures = videoIn.UserData;closeVideoFuture = afterAll(postProcessFutures,@() close(videoOut),0);

本例中的后处理操作可能需要几分钟。在Windows 10上,Intel®Xeon®W-2133 3.60 GHz处理器,6核,后处理需要4分钟。

您可以使用等待条来跟踪后处理进度。若要在每个后处理操作完成后更新等待栏,请使用afterEach.要在所有操作完成后关闭等待栏,请使用毕竟.有关更多信息,请参见异步更新用户界面使用afterEach和afterAll

H = waitbar(0,“后处理…”);updateWaitbarFuture = afterEach(postProcessFutures,...@ (~) waitbar(总和(strcmp (“完成”, {postProcessFutures.State})) /元素个数(postProcessFutures), h), 1);afterAll(closeVideoFuture, @() close(h),0);

通过等待future变量,阻塞客户端会话中的执行,直到写入完成。

等待(closeVideoFuture);

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

删除(videoIn);

可视化的结果

创建视频文件后,您可以将结果可视化。

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

vidObj =视频阅读器(“OutputFolder / MyVideo.avi”);

读取一些帧使用readFrame函数。

图像= cell(1,5);时间= .4:.4:2;ii = 1:数值(次数)vidObj。CurrentTime = times(ii);images{ii} = readFrame(vidObj);结束

要使框架可视化,请使用蒙太奇函数。

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

定义Helper函数

定义主后处理例程,在每次帧采集后执行。这个函数postProcessAndWrite从视频输入对象中获取数据并调用parfeval在并行工作中开始帧去噪。

函数postProcessAndWrite(videoIn,~,C,Q) [frame,~,metadata] = getdata(videoIn,1);postProcessFuture = parfeval(@postProcess,0,帧,C,Q,元数据. framenumber);videoIn。用户数据= [videoIn.UserData postProcessFuture];结束

定义要在worker中执行的后处理函数。对于本例,为了简化计算,将每个帧转换为灰色,然后使用denoiseImage函数。这个函数后处理对象中存储的帧和去噪网络对象价值字段parallel.pool.Constant对象作为输入。有关使用去噪神经网络去噪图像的更多信息,请参见得到预训练的图像去噪网络(图像处理工具箱)

函数postProcess(frame,C,Q,frameNumber) grayFrame = im2double(rgb2gray(frame));denoisedGrayFrame =去噪图像(grayFrame,C.Value);降噪grayframe = im2uint8(降噪grayframe);发送(Q, frameNumber denoisedGrayFrame)结束

另请参阅

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

相关的例子

更多关于