В этом примере показано, как использовать Toolbox™ Parallel Computing совместно с Toolbox™ Image Acquisiton для получения и сохранения изображений в отдельном работнике MATLAB ®.
Это позволяет выполнять другие операции в основном работнике MATLAB с минимальным влиянием на получение изображения. В результате сбор изображений становится более последовательным, и вы можете параллельно выполнять больше операций с большим объемом процессора на многоядерных процессорах.
В этом примере используется parfeval для асинхронного выполнения указанной функции из панели инструментов параллельных вычислений. Указанную функцию можно запустить в фоновом режиме основного работника MATLAB, не дожидаясь ее завершения. Дополнительные сведения об этой функции см. в разделе parfeval(Панель инструментов параллельных вычислений).
Создание функции с именем 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