Вывод видео на OpenCV

Материал из roboforum.ru Wiki

Перейти к: навигация, поиск

Сегодня я вам покажу как вывести видео в нашем приложении при помощи OpenCV. Это так же легко, как и работа с изображением. Помимо прошлых действий нам потребуется сделать цикл, для чтения каждого кадра видео, так же нам потребуется команда, по который мы сможем выйти из этого цикла, если видео покажется слишком скучным.=) Приступим!

#include “highgui.h”
 
int main( int argc, char** argv )
{
cvNamedWindow(AVI Video”, CV_WINDOW_AUTOSIZE );
CvCapture* capture = cvCreateFileCapture( argv[1] );
IplImage* frame;
while(1) 
{
frame = cvQueryFrame( capture ); 
if( !frame ) break;
cvShowImage(AVI Video”, frame );
char c = cvWaitKey(33);
if( c == 27 ) break;
}
cvReleaseCapture( &capture );
cvDestroyWindow(AVI Video);
}

Результат работы программы (кадр из фильма "Трансформеры"). Изображение:avi.png

Функции которые мы рассматривали в прошлом уроке, в этом описываться не будут.

CvCapture* capture = cvCreateFileCapture( argv[1] );

Данная функция принимает в качестве аргумента параметр в котором мы передаём путь считываемого AVI файла и возвращает указатель на структуру CvCapture. Эта структура хранит всю информацию о AVI файле.

frame = cvQueryFrame( capture );

Внутри цикла while(1) мы начинаем считывание AVI файла. cvQueryFrame() принмает в качестве аргумента указатель на структуру CvCapture. И затем с каждым циклом заносит в память следующий кадр видео. Указатель возвращается на этот кадр.

char c = cvWaitKey(33);
if( c == 27 ) break;

Когда мы отобразили очередной кадр, то мы ждём 33 миллисекунды (на самом деле вы можете поставить какую угодно задержку, но данная считается оптимальной для отображения 30 кадров в секунду, а 3 миллисекунды примите пока на веру:)) перед выводом следующего кадра. Если пользователь нажимает клавишу на клавиатуре, то функция cvWaitKey() передаёт переменной "с" ASCII код этой клавиши и если пользователь нажал Esc (ASCII 27), то тогда мы выходим из цикла, иначе проходит 33 мс и цикл продолжается.

cvReleaseCapture( &capture );

Так или иначе - цикл преравался (видео закончилось или была нажата клавиша Esc), тогда этой функцией мы высвобождаем память связанную со структурой CvCapture. Вот и всё! Немного позже я расскажу о том, как добавить в наше приложение slidebar, чтобы можно было перематывать видео! Удачи!;) Как всегда все вопросы вы можете задать здесь: Вопросы по OpenCV