Получите изображения Используя параллельных рабочих

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

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

Настройте изображение Acquistion

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

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

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

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

mkdir("data\")

Запустите получение изображений на параллельном рабочем

Создайте параллельный пул с одним рабочим на вашей локальной машине с помощью 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

Функция обратного вызова, чтобы сохранить образы

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