Этот пример показывает, как создать видео таймлапса использование событий таймера, чтобы предварительно квалифицировать кадры.
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 в свойстве 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);
Если получение завершается, получите объект VideoWriter, хранивший в свойстве UserData, и используйте функцию close
, чтобы высвободить средства, сопоставленные с ним.
avi = vid.UserData; avi = close(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