В этом примере показано, как использовать Parallel Computing Toolbox™ вместе с Изображением Acquisiton Toolbox™, чтобы получить и сохранить образы в отдельном рабочем MATLAB®.
Выполнение так позволяет вам выполнять другие операции в основном работнике MATLAB с минимальным ударом на получение изображений. В результате ваше получение изображений более сопоставимо, и можно запустить больше интенсивных действий центрального процессора параллельно на многожильных центральных процессорах.
Этот пример использует 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