Получение изображений с помощью параллельных рабочих процессов

В этом примере показано, как использовать Parallel Computing Toolbox™ вместе с Toolbox™ Image Acquisiton для получения и сохранения изображений в отдельном рабочем файле MATLAB ®.

Это позволяет вам выполнять другие операции в основном работнике MATLAB с минимальным влиянием на сбор изображений. В результате ваш сбор изображений является более последовательным, и вы можете выполнять больше интенсивных операций CPU параллельно на многоядерных центральных процессорах.

Настройка извлечения изображений

Этот пример использует parfeval функция из Parallel Computing Toolbox, чтобы асинхронно выполнить указанную функцию. Можно запустить указанную функцию в фоновом режиме основного работника MATLAB, не дожидаясь ее завершения. Для получения дополнительной информации об этой функции см. parfeval (Parallel Computing Toolbox).

Создайте функцию, называемую captureVideo для выполнения на параллельном работнике MATLAB. Эта функция создает новую videoinput Объект и устанавливает FramesAcquiredFcn свойство. Затем он конфигурирует системы координат для получения и начинает сбор. Смотрите captureVideo функция в конце этого примера. Можно изменять captureVideo для соответствия вашим потребностям в сборе изображений и настройке.

The captureVideo функция устанавливает FramesAcquiredFcn свойство указателю на saveImages функцию обратного вызова. The saveImages функция сохраняет полученные изображения в папке в текущей рабочей директории. Смотрите saveImages функция в конце этого примера.

Прежде чем вы начнете сбор изображений, создайте папку с именем data, где параллельный рабочий сохраняет ваши полученные изображения.

mkdir("data\")

Запуск сбора изображений на Parallel Worker

Создайте параллельный пул с одним рабочим процессом на локальном компьютере с помощью parpool.

parpool('local',1);
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 1).

Запуск captureVideo функционирует в вашем параллельном рабочем процессе, используя parfeval. Начиная с captureVideo не имеет никаких выходов, задайте количество выходных аргументов следующим 0.

f = parfeval(@captureVideo,0)
f = 
 FevalFuture with properties: 

                   ID: 4
             Function: @captureVideo
       CreateDateTime: 13-Jan-2021 11:58:35
        StartDateTime: 13-Jan-2021 11:58:35
     Running Duration: 0 days 0h 0m 0s
                State: running
                Error: none

Выходы показывают, что состояние parfeval будущее running.

Если вы хотите заблокировать MATLAB до parfeval завершает, можно использовать wait функция на будущее f. Использование функции ожидания полезно, когда последующий код зависит от завершения parfeval.

wait(f);

Отобразите parfeval будущее, чтобы подтвердить, что его статус finished.

disp(f);
 FevalFuture with properties: 

                   ID: 4
             Function: @captureVideo
       CreateDateTime: 13-Jan-2021 11:58:35
        StartDateTime: 13-Jan-2021 11:58:35
     Running Duration: 0 days 0h 0m 15s
                State: finished (unread)
                Error: none

Ваши изображения получаются и сохраняются в data папка в текущей рабочей директории.

Завершение работы параллельного пула

Когда вы закончите работать с параллельным пулом, очистите будущее и закройте параллельный пул.

clear f
delete(gcp("nocreate"))

Вспомогательные функции

Функция для захвата видео

Параллельный рабочий процесс выполняет captureVideo функция. Эта функция создает videoinput Объект и устанавливает соответствующие свойства. Вы можете изменить его в соответствии с вашими потребностями в сборе изображений.

function captureVideo()
    % Create videoinput object.
    v = videoinput('winvideo');
    
    % Specify a custom callback to save images.
    v.FramesAcquiredFcn = @saveImages;
    
    % Specify the number of frames to acquire before calling the callback.
    v.FramesAcquiredFcnCount = 60;
    
    % Specify the total number of frames to acquire.
    v.FramesPerTrigger = 120;
    
    % Start recording.
    start(v);
    
    % Wait for the acquision to finish.
    wait(v);
end

Функция обратного вызова для сохранения изображений

The captureVideo функция устанавливает saveImages коллбэк как FramesAcquiredFcn для videoinput объект. Эта функция считывает количество систем координат, заданное FramesAcquiredFcnCount из буфера и сохраняет их в data папка. Можно изменить этот коллбэк в соответствии с вашими потребностями.

function saveImages(src,obj)
    % Calculate the total frame number for each frame, 
    % in order to save the files in order.
    currframes = src.FramesAcquired - src.FramesAcquiredFcnCount;
    
    % Read images from the videoinput buffer.
    imgs = getdata(src,src.FramesAvailable);
    
    % Save each image to a file in order.
    for i = 1:src.FramesAcquiredFcnCount
        imname = "data\img_" + (currframes + i) + ".TIFF";
        imwrite(imgs(:,:,:,i),imname);
    end
end