В этом примере показано, как создать видео таймлапса, не используя все системы координат приобретения.
Image Acquisition Toolbox™ дает возможность производить видео таймлапса. Самый эффективный способ сделать приобретение таймлапса состоит в том, чтобы использовать встроенную способность Image Acquisition Toolbox регистрировать системы координат непосредственно к файлу AVI и его способности выполнить децимацию времени путем сохранения только части всех систем координат, полученных камерой.
См. последовательность таймлапса один день длиной. (21 секунда)
Прежде, чем получить изображения с помощью Image Acquisition Toolbox, создайте объект ввода видео.
% When executing the following code, you may need to % modify it to match your acquisition hardware. vid = videoinput('winvideo',1,'RGB24_352x288');
Большинство устройств не позволяет вам управлять своей частотой кадров. Лучше определять частоту кадров экспериментально путем получения систем координат и анализа меток времени систем координат.
vid.FramesPerTrigger = 100; start(vid); wait(vid,Inf); % Retrieve the frames and timestamps for each frame. numframes = vid.FramesAvailable; [frames,time] = getdata(vid,numframes); % Calculate the frame rate by taking the average difference % between the timestamps for each frame. framerate = mean(1./diff(time))
framerate = 17.5296
FrameGrabInterval
свойство задает, как часто системы координат хранятся от видеопотока. Например, если мы устанавливаем его на 5, затем только 1 из 5 систем координат сохранена - другие 4 системы координат будут отброшены.
% We want to compress 30 seconds into 3 seconds, so % only acquire every tenth frame. vid.FrameGrabInterval = 10;
Чтобы определить сколько систем координат, чтобы получить всего, вычислите общее количество систем координат, которые были бы получены в частоте кадров устройства, и затем делиться на FrameGrabInterval
.
capturetime = 30; interval = vid.FrameGrabInterval; numframes = floor(capturetime * framerate / interval)
numframes = 52
vid.FramesPerTrigger = numframes;
Из-за большого количества систем координат, которые будут получены, это более практично, чтобы регистрировать изображения к диску, а не к памяти. Используя Image Acquisition Toolbox, можно регистрировать изображения непосредственно к файлу AVI. Мы конфигурируем это использование LoggingMode
свойство.
vid.LoggingMode = 'disk';
Создайте объект VideoWriter регистрировать к, с помощью VideoWriter
команда. Мы должны задать имя файла, чтобы использовать, и затем установить частоту кадров, в которой должен быть воспроизведен файл AVI. Затем установите DiskLogger
свойство ввода видео возражает против объекта VideoWriter.
vwObj = VideoWriter('timelapsevideo','Uncompressed AVI'); vwObj.FrameRate = framerate; vid.DiskLogger = vwObj; vid
Summary of Video Input Object Using 'Logitech QuickCam Fusion'. Acquisition Source(s): input1 is available. Acquisition Parameters: 'input1' is the current selected source. 91 frames per trigger using the selected source. 'RGB24_352x288' video data to be logged upon START. Grabbing first of every 10 frame(s). Log data to 'disk' on trigger. Trigger Parameters: 1 'immediate' trigger(s) on START. Status: Waiting for START. 100 frames acquired since starting. 0 frames available for GETDATA.
Запустите приобретение таймлапса и ожидайте приобретения, чтобы завершиться. Обратите внимание на то, что Image Acquisition Toolbox не связывает MATLAB®, в то время как это получает. Можно запустить приобретение и продолжить работать в MATLAB.
start(vid);
% Wait for the capture to complete before continuing.
wait(vid,Inf);
Если получение завершается, получите объект файла AVI и используйте close
функция, чтобы высвободить средства, сопоставленные с ним.
vwObj = vid.DiskLogger; close(vwObj);
Чтобы воспроизвести таймлапс последовательность AVI, щелкните правой кнопкой по имени файла в Браузере текущей папки MATLAB и выберите Open Outside MATLAB из контекстного меню.
Когда вы закончите с объектом ввода видео, необходимо использовать delete
функционируйте, чтобы освободить аппаратные ресурсы, сопоставленные с ним и удалить его из рабочей области с помощью clear
функция.
delete(vid);
clear vid;