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

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск

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

<source lang="C">#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” ); }</source>

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

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

<source lang="C">CvCapture* capture = cvCreateFileCapture( argv[1] );</source> Данная функция принимает в качестве аргумента параметр в котором мы передаём путь считываемого AVI файла и возвращает указатель на структуру CvCapture. Эта структура хранит всю информацию о AVI файле.

<source lang="C">frame = cvQueryFrame( capture );</source> Внутри цикла while(1) мы начинаем считывание AVI файла. cvQueryFrame() принмает в качестве аргумента указатель на структуру CvCapture. И затем с каждым циклом заносит в память следующий кадр видео. Указатель возвращается на этот кадр.

<source lang="C">char c = cvWaitKey(33); if( c == 27 ) break;</source> Когда мы отобразили очередной кадр, то мы ждём 33 миллисекунды (на самом деле вы можете поставить какую угодно задержку, но данная считается оптимальной для отображения 30 кадров в секунду, а 3 миллисекунды примите пока на веру:)) перед выводом следующего кадра. Если пользователь нажимает клавишу на клавиатуре, то функция cvWaitKey() передаёт переменной "с" ASCII код этой клавиши и если пользователь нажал Esc (ASCII 27), то тогда мы выходим из цикла, иначе проходит 33 мс и цикл продолжается.

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