ビデオ入出力
■ カメラ,ビデオファイル
OpenCVでは,実際のカメラや動画像ファイルからキャプチャを行ったり,逆に画像列を動画像ファイルとして書き出したりすることが可能である.カメラからの画像キャプチャ cvCreateCameraCapture, cvQueryFrame
指定された番号のカメラから画像をキャプチャして表示する
サンプルコード
#include <cv.h> #include <highgui.h> #include <ctype.h> int main (int argc, char **argv) { CvCapture *capture = 0; IplImage *frame = 0; double w = 320, h = 240; int c; // (1)コマンド引数によって指定された番号のカメラに対するキャプチャ構造体を作成する if (argc == 1 || (argc == 2 && strlen (argv[1]) == 1 && isdigit (argv[1][0]))) capture = cvCreateCameraCapture (argc == 2 ? argv[1][0] - '0' : 0); /* この設定は,利用するカメラに依存する */ // (2)キャプチャサイズを設定する. cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w); cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h); cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE); // (3)カメラから画像をキャプチャする while (1) { frame = cvQueryFrame (capture); cvShowImage ("Capture", frame); c = cvWaitKey (2); if (c == '\x1b') break; } cvReleaseCapture (&capture); cvDestroyWindow ("Capture"); return 0; }
// (1)コマンド引数によって指定された番号のカメラに対するキャプチャ構造体を作成する
関数 cvCreateCameraCapture()を用いて,
コマンド引数として与えられた番号のカメラに対するキャプチャ構造体 CvCaptureを作成する.
引数が指定されない場合は,デフォルトの値である"0"が利用される.
OpenCV-1.0.0のサンプルプログラムでは,cvCreateCameraCaptureの代りに,
cvCaptureFromCAM が用いられているが,実際は highgui.h内で,
#define cvCaptureFromCAM cvCreateCameraCaptureのように定義されており,これらの関数は等価である. ここでは,マニュアルに従い関数 cvCreateCameraCapture を用いる.
// (2)キャプチャサイズを設定する
関数cvSetCaptureProperty()により,キャプチャをおこなう際の画面サイズ(幅と高さ)を指定する.
ただし,実際のカメラがサポートしていないキャプチャサイズは指定できない.
// (3)カメラから画像をキャプチャする
ループブロック中に関数 cvQueryFrame() を呼び出すことで,実際にキャプチャを行い,
それを表示する.
キャプチャ中に"Esc"キーが押された場合は,終了する.
実行結果例
動画としてファイルへ書き出す cvCreateVideoWriter, cvWriteFrame, cvReleaseVideoWriter
カメラからキャプチャしたフレームを,順次ファイルに書き出す
サンプルコード
#include <cv.h> #include <highgui.h> #include <ctype.h> #include <stdio.h> int main (int argc, char **argv) { CvCapture *capture = 0; IplImage *frame = 0; CvVideoWriter *vw; double w = 320, h = 240; int c, num = 0; CvFont font; char str[64]; // (1)コマンド引数によって指定された番号のカメラに対するキャプチャ構造体を作成する if (argc == 1 || (argc == 2 && strlen (argv[1]) == 1 && isdigit (argv[1][0]))) capture = cvCaptureFromCAM (argc == 2 ? argv[1][0] - '0' : 0); // (2)キャプチャサイズを設定する cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w); cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h); // (3)ビデオライタ構造体を作成する vw = cvCreateVideoWriter ("cap.avi", CV_FOURCC ('X', 'V', 'I', 'D'), 15, cvSize ((int) w, (int) h)); cvInitFont (&font, CV_FONT_HERSHEY_COMPLEX, 0.7, 0.7); cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE); // (4)カメラから画像をキャプチャし,ファイルに書き出す while (1) { frame = cvQueryFrame (capture); snprintf (str, 64, "%03d[frame]", num); cvPutText (frame, str, cvPoint (10, 20), &font, CV_RGB (0, 255, 100)); cvWriteFrame (vw, frame); cvShowImage ("Capture", frame); num++; c = cvWaitKey (10); if (c == '\x1b') break; } // (5)書き込みを終了し,構造体を解放する cvReleaseVideoWriter (&vw); cvReleaseCapture (&capture); cvDestroyWindow ("Capture"); return 0; }
// (1)コマンド引数によって指定された番号のカメラに対するキャプチャ構造体を作成する
前述のキャプチャサンプルと同様に,構造体を作成する.
// (2)キャプチャサイズを設定する
前述のキャプチャサンプルと同様に,キャプチャサイズを設定する.
// (3)ビデオライタ構造体を作成する
ファイルに書き出すためのビデオライタ構造体を作成する.引数には,順に,
(ファイル名,コーデック指定子,フレームレート,サイズ)を指定する.
ここでは,コーデックの指定に,CV_FOURCC('X','V','I','D')(XVID)を用いているが,
リファレンス マニュアルにあるように,CV_FOURCC('M','J','P','G')(モーションJPEG)や
CV_FOURCC('P','I','M','1')(MPEG-1)を利用することもできる.
非圧縮での保存を希望する場合は,CV_FOURCC('D','I','B',' ')を指定すればよい.
もちろん,利用されるコーデックがインストールされている必要がある.
また,MacOSXでは,ファイル名をフルパスで指定するか,あるいは,touchコマンドなどで予めファイル作成しておく必要があるようである.
// (4)カメラから画像をキャプチャし,ファイルに書き出す
カメラから画像をキャプチャし,その画像に対して文字列を書き込んだ後に,
関数 cvWrtiteFrame()によって順次ファイルに書き出す.
// (5)書き込みを終了し,構造体を解放する
"Esc"キーでループを抜けた後には,関数cvReleaseVideoWriter()によって,書き込みを終了させ,構造体を解放する.