今日は、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” );
}
プログラムの結果(映画「トランスフォーマー」のフレーム)。
このレッスンでは、前回のレッスンで調べた機能については説明しません。
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()関数は変数「c」にこのキーのASCIIコードを渡し、ユーザーがEsc(ASCII 27)を押すと、ループを終了します。
cvReleaseCapture( &capture );
何らかの方法でサイクルが中断され(ビデオが終了するか、Escキーが押された)、この関数を使用して、CvCapture構造体に関連付けられたメモリを解放します。
以上です! 少し後、ビデオを巻き戻すことができるように、アプリケーションにスライドバーを追加する方法について説明します。
頑張って!;)