与后期处理并行执行网络摄像头图像采集
此示例展示了如何并行执行网络摄像头的帧采集和数据后处理。
在示例中,您使用并行工作单元执行图像采集,然后使用 DataQueue
对象将数据流回客户端进行后期处理。
要使用工作单元而不是 MATLAB® 客户端执行后处理,请参阅 执行图像采集和并行图像处理。
设置并行环境
在本地集群上启动一个具有一个工作单元的并行池。
parpool('Processes',1);
Starting parallel pool (parpool) using the 'Processes' profile ... Connected to parallel pool with 1 workers.
为了将信息从工作单元发送回 MATLAB 客户端,需要创建一个 DataQueue
对象。
D = parallel.pool.DataQueue;
创建一个图形对象,并将 'Visible'
设置为 'on'
,以便它在实时脚本之外打开。要在每次从 DataQueue
对象到达时显示图像,请使用 afterEach
。
fig = figure('Visible','on'); afterEach(D,@processDisp);
并行获取数据并执行并行处理
定义采集频率,即每秒要从相机中提取多少帧。
freq = 5;
选择一个考虑到后处理所需时间的值。否则,视频流会随着时间的推移而明显滞后。
要在并行工作单元上启动数据采集,请调用 parfeval
并传递采集函数、DataQueue
对象和采集率作为参量。
f = parfeval(@getFrameFromCamera,0,D,freq);
获取 30 秒周期内的帧。此示例应用模糊滤镜作为后处理步骤,并并排显示原始帧和处理后的帧。
pause(30);
要停止视频馈送,请取消采集。
cancel(f);
有关显示工作单元后期处理的更详细示例,请参阅 执行图像采集和并行图像处理。
定义辅助函数
getFrameFromCamera
函数连接到网络摄像头,然后获取图像帧并无限循环地将它们发送到 DataQueue
对象。
function getFrameFromCamera(D,freq) cam = webcam; while true img = snapshot(cam); send(D,img); pause(1/freq); end end
每次数据到达 processDisp
对象时,DataQueue
函数都会对帧进行后处理并显示原始帧和处理后的帧。
function processDisp(img) imgBlur = imgaussfilt(img,3); imshow([img, imgBlur],'Parent',gca) end
另请参阅
parpool
| parallel.pool.DataQueue
| afterEach
| parfeval
| imshow