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