主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

与后期处理并行执行网络摄像头图像采集

此示例展示了如何并行执行网络摄像头的帧采集和数据后处理。

在示例中,您使用并行工作单元执行图像采集,然后使用 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

另请参阅

| | | |

主题