Создание видео таймлапса Используя События таймера

Этот пример показывает, как создать видео таймлапса использование событий таймера, чтобы предварительно квалифицировать кадры.

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');

Сконфигурируйте таймер

Чтобы сгенерировать события таймера, мы задаем две вещи: что происходит, когда происходит, и как часто это должно произойти. Свойство TimerFcn задает функцию обратного вызова, чтобы выполниться, когда событие таймера имеет место. Событие таймера имеет место, когда период времени, заданный свойством TimerPeriod, истекает.

Функция обратного вызова ответственна за инициирование приобретения и хранение кадра в файл AVI. Больше деталей о том, как использовать этот коллбэк, может быть найдено в документации. Эта функция обратного вызова сама задана в файле timelapse_timer.m

Настройка, которую мы будем использовать,

  • timelapse_timer выполнится каждый раз, когда таймер протекает

  • Таймерная функция будет выполняться всех секунду

set(vid,'TimerPeriod',1);
vid.TimerFcn = @timelapse_timer;

Храните объект VideoWriter

Храните объект VideoWriter в свойстве UserData объекта ввода видео так, чтобы это было доступно в коллбэке.

vwObj = VideoWriter('timelapsevideo', 'Uncompressed AVI');
vwObj.FrameRate = 15;
open(vwObj);

Сконфигурируйте объект ввода видео использовать ручное инициирование

Каждый раз событие таймера имеет место

  • Вручную инициируйте приобретение с помощью команды triggerconfig

  • Получите один кадр

  • Получите 9 дополнительной триггерной ценности данных для в общей сложности 10 кадров

triggerconfig(vid, 'manual');
vid.FramesPerTrigger = 1;
vid.TriggerRepeat = 9;
vid
Summary of Video Input Object Using 'Logitech QuickCam Fusion'.

   Acquisition Source(s):  input1 is available.

  Acquisition Parameters:  'input1' is the current selected source.
                           1 frames per trigger using the selected source.
                           'RGB24_352x288' video data to be logged upon START.
                           Grabbing first of every 1 frame(s).
                           Log data to 'memory' on trigger.

      Trigger Parameters:  10 'manual' trigger(s) upon TRIGGER.

                  Status:  Waiting for START.
                           0 frames acquired since starting.
                           0 frames available for GETDATA.

Выполните приобретение таймлапса

Теперь, запустите приобретение промежутка времени и ожидайте в течение максимум 20 секунд приобретения, чтобы завершиться.

start(vid);
wait(vid,20);

Закройте файл AVI

Если получение завершается, получите объект VideoWriter, хранивший в свойстве UserData, и используйте функцию close, чтобы высвободить средства, сопоставленные с ним.

avi = vid.UserData;
avi = close(avi);

Воспроизведите таймлапс последовательность AVI

Чтобы воспроизвести таймлапс последовательность AVI, щелкните правой кнопкой по имени файла в Браузере текущей папки MATLAB® и выберите Open Outside MATLAB из контекстного меню.

Очистка

По окончании с объектом ввода видео, необходимо использовать функцию delete, чтобы освободить аппаратные ресурсы, сопоставленные с ним и удалить его из рабочей области с помощью функции clear.

delete(vid);
clear vid;

Функция обратного вызова таймера

Следующее является описанием функции обратного вызова, выполняемой для каждого события таймера

  • Инициируйте тулбокс, чтобы получить один кадр

  • Получите кадр

  • Определите, сохранить ли кадр

  • Используйте функцию writeVideo, чтобы добавить кадр в файл AVI

Объект VideoWriter хранится в свойстве UserData объекта.

type timelapse_timer
function timelapse_timer(vid,~)
% This callback function triggers the acquisition and saves frames to an AVI file.

% trigger the acquisition and get the frame
trigger(vid);
frame = getdata(vid,1);

% Retrieve the total number of frames acquired
numframes_acquired = vid.FramesAcquired;

% Drop every other frame:  If the frame is odd,
% keep it.  If it is an even frame, do not keep it.
keepframe = (mod(numframes_acquired,2) == 1);

% Insert your processing code here

if(~keepframe)
    return;
end

% Retrieve the VideoWriter object stored in the UserData
% property.
vwObj = vid.UserData;

% Add the frame to the AVI
writeVideo(vwObj, frame);

end