Assign different tasks to each worker in the SPMD block for multi-camera image capture and saving.

5 views (last 30 days)
I have two cameras and I can created 2 worker in spmd and capture/save image. But I want to create 5 workers through spmd and assign different tasks to them. Worker 1 receives position measurements. Worker 2 and 3 capture images, and worker 4 and 5 receive data from worker 1 for file name and save images captured by worker 2 and 3.
Is there a feasible solution? If not, can I have 4 workers. 2 captue image and 2 save image?
My codes was based on the 'example_videoinput_spmd_logtodisk.m'
if ~isempty(gcp('nocreate'))
delete(gcp('nocreate'));
end
%% camera connection
%Create connection to the device using the specified adaptor with the specified format.
%% Create a parallel pool with two workers, one per camera
if isempty(gcp('nocreate'))
parpool(2)
end
%% Disconnect from all cameras from main MATLAB process and workers
delete(imaqfind);
spmd(2)
delete(imaqfind);
end
% Create videoinput objects (one camera per worker)
spmd(2)
% labBarrier ensures that the camera detection code is called
% by only one worker at a time.
for idx = 1:spmdSize
if idx == spmdIndex
imaqreset
% Configure acquisition to not stop if dropped frames occur
% imaqmex('feature', '-gigeDisablePacketResend', true);
% Detect cameras
gigeinfo = imaqhwinfo('gentl');
numCamerasFound = numel(gigeinfo.DeviceIDs);
fprintf('Worker %d detected %d cameras.\n', ...
spmdIndex, numCamerasFound);
end
spmdBarrier
end
cameraID = spmdIndex;
v = videoinput('gentl', cameraID,'RGB8');
v.ReturnedColorspace = "rgb";
s = v.Source;
% Configure properties common for both cameras
% s.PacketSize = 4000;
% s.ExposureTimeAbs = 10000;
% v.FramesPerTrigger = 1000;
s.AcquisitionFrameRate = 2;
end
T = 5; % minutes
ti = datetime('now');
tf = datetime('now');
spmd(2)
while (minutes(tf-ti) < T)
img = getsnapshot(v);
t = datetime(datetime('now','Format','dd-MM-yyyy_HH_mm_ss_SSS'));
file_name = string(t) + ".png";
imwrite(img,file_name);
tf = datetime('now');
end
end

Answers (1)

Ayush
Ayush on 30 Sep 2024
Hi @Josh,
I understand you need to create 5 workers through “spmd” and assign different tasks to them.
Some key modifications which can be done:
  1. A shared cell array “taskQueue” can be used to store tasks. Each cell entry consists of an image and its corresponding filename.
  2. When workers 2 and 3 capture an image, they append the image and filename to the “taskQueue”.
  3. Workers 4 and 5 check the queue for available tasks. If a task is found, they process it by saving the image and removing the task from the queue.
  4. A pause can be added to minimize the CPU usage when the queue is empty.
I’ve attached modified code for your reference:
if ~isempty(gcp('nocreate'))
delete(gcp('nocreate'));
end
if isempty(gcp('nocreate'))
parpool(5);
end
delete(imaqfind);
spmd(5)
delete(imaqfind);
end
taskQueue = cell(0, 2); % Column 1: Image, Column 2: Filename
spmd(5)
if spmdIndex == 1
% Worker 1: Position measurement (mockup)
while true
position = rand(1, 2);
disp(['Worker 1: Position = ', num2str(position)]);
pause(1);
end
elseif spmdIndex == 2 || spmdIndex == 3
% Workers 2 and 3: Capture images
imaqreset;
gigeinfo = imaqhwinfo('gentl');
cameraID = spmdIndex;
v = videoinput('gentl', cameraID, 'RGB8');
v.ReturnedColorspace = "rgb";
s = v.Source;
s.AcquisitionFrameRate = 2;
while true
img = getsnapshot(v);
t = datetime('now', 'Format', 'dd-MM-yyyy_HH_mm_ss_SSS');
file_name = sprintf('img_%d_%s.png', spmdIndex, char(t));
% Schedule task by adding to the queue
taskQueue{end+1, 1} = img; % Add image
taskQueue{end, 2} = file_name; % Add filename
disp(['Worker ', num2str(spmdIndex), ': Captured ', file_name]);
% Optionally, you can add a short pause
pause(1);
end
elseif spmdIndex == 4 || spmdIndex == 5
% Workers 4 and 5: Save images
while true
if ~isempty(taskQueue)
% Process the next task in the queue
img = taskQueue{1, 1}; % Get the first image
file_name = taskQueue{1, 2}; % Get the corresponding filename
% Remove the processed task from the queue
taskQueue(1, :) = [];
% Save the image
imwrite(img, file_name);
disp(['Worker ', num2str(spmdIndex), ': Saved ', file_name]);
else
% If no tasks are available, pause
pause(1); % Avoid busy waiting
end
end
end
end
You can read more about “imwrite” function here: https://www.mathworks.com/help/matlab/ref/imwrite.html
Hope this helps!

Products


Release

R2024a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!