Perform Webcam Image Acquisition in Parallel with Postprocessing
This example shows how to perform frame acquisition from a webcam in parallel with data postprocessing.
In the example, you use a parallel worker to perform image acquisition and then stream the data back to the client for postprocessing by using a
To perform postprocessing using workers instead of your MATLAB client, see Perform Image Acquisition and Parallel Image Processing.
Set Up Parallel Environment
Start a parallel pool with one worker on the local cluster.
Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 1).
To send information back from the worker to the MATLAB client, create a
D = parallel.pool.DataQueue;
Create a figure object, and set
'on' so that it opens outside of the live script. To display images every time they arrive from the
DataQueue object, use
fig = figure('Visible','on'); afterEach(D,@processDisp);
Fetch Data and Perform Postprocessing in Parallel
Define the frequency of acquisition, that is, how many frames per second you want to pull out from the camera.
freq = 5;
Select a value that takes into account how long postprocessing takes. Otherwise the video stream can significantly lag over time.
To start data acquisition on the parallel worker, call
parfeval and pass the acquisition function, the
DataQueue object, and the acquisition rate as arguments.
f = parfeval(@getFrameFromCamera,0,D,freq);
Acquire frames for a period of 30 seconds. This example applies a blurring filter as the postprocessing step and shows the original and processed frames side by side.
To stop the video feed, cancel the acquisition.
For a more detailed example showing postprocessing on workers, see Perform Image Acquisition and Parallel Image Processing.
Define Helper Functions
getFrameFromCamera function connects to the webcam, then acquires image frames and sends them to the
DataQueue object in an infinite loop.
function getFrameFromCamera(D,freq) cam = webcam; while true img = snapshot(cam); send(D,img); pause(1/freq); end end
processDisp function postprocesses frames and displays the original and processed frames each time data arrives to the
function processDisp(img) imgBlur = imgaussfilt(img,3); imshow([img, imgBlur],'Parent',gca) end