В этом примере показано, как создать видео с временным интервалом, используя события таймера для предварительной оценки кадров.
Toolbox™ «Получение изображения» позволяет легко создавать видео с временным интервалом. В этом примере мы будем использовать события таймера для получения кадров в файл AVI. Этот метод прореживания времени имеет то преимущество, что он позволяет принимать решение о каждом кадре перед его хранением. Применение этого было бы связано только с хранением кадров, которые удовлетворяют определенным уровням освещения, имеют движение относительно предыдущего кадра и т.д.
Следите за продолжительной временной последовательностью. (21 секунда)
Перед получением изображений с помощью панели инструментов получения изображений создайте объект ввода видео.
% 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;
Сохранить объект VideyWriter в 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);
После завершения записи извлеките объект VideyWriter, сохраненный в свойстве UserData, и используйте close для освобождения связанных с ним ресурсов.
avi = vid.UserData; avi = close(avi);
Для воспроизведения временной последовательности AVI щелкните правой кнопкой мыши имя файла в браузере «Текущая папка MATLAB ®» и выберите в контекстном меню команду «Открыть внешнюю папку MATLAB ».
Когда вы закончите с объектом ввода видео, вы должны использовать delete чтобы освободить связанные с ним аппаратные ресурсы и удалить их из рабочей области с помощью clear функция.
delete(vid);
clear vid;
Ниже приведено описание функции обратного вызова, выполняемой для каждого события таймера.
Запуск панели инструментов для получения одной рамки
Извлечение кадра
Определение необходимости сохранения кадра
Используйте writeVideo добавление кадра в файл AVI
Объект VideyWriter хранится в 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