- A shared cell array “taskQueue” can be used to store tasks. Each cell entry consists of an image and its corresponding filename.
- When workers 2 and 3 capture an image, they append the image and filename to the “taskQueue”.
- 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.
- A pause can be added to minimize the CPU usage when the queue is empty.
Assign different tasks to each worker in the SPMD block for multi-camera image capture and saving.
    조회 수: 4 (최근 30일)
  
       이전 댓글 표시
    
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
댓글 수: 0
답변 (1개)
  Ayush
 2024년 9월 30일
        I understand you need to create 5 workers through “spmd” and assign different tasks to them.
Some key modifications which can be done:
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!
댓글 수: 0
참고 항목
카테고리
				Help Center 및 File Exchange에서 Parallel Computing Fundamentals에 대해 자세히 알아보기
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

