About BBS

ビデオ入出力

作成者: 怡土順一, 最終変更者: 小枝正直, 最終変更リビジョン: 374, 最終変更日時: 2008-07-01 22:52:37 +0900 (火, 01 7月 2008)

■ カメラ,ビデオファイル

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"キーが押された場合は,終了する.

実行結果例

You need to upgrade your Flash Player


動画としてファイルへ書き出す 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()によって,書き込みを終了させ,構造体を解放する.

実行結果例

You need to upgrade your Flash Player

OpenCV-1.0 リファレンス マニュアル
OpenCV-1.1pre リファレンス マニュアル
OpenCVサンプルコード


画素値の直接操作
部分画像のシャッフル
画像の連結
画像のコピー
画像形状の変形
タイリング
画像の反転
逆行列(擬似逆行列)の計算
色空間の写像
離散フーリエ変換
階層構造を持つ輪郭の座標取得
図形の描画
ポリゴンの描画
凸ポリゴンの描画
テキストの描画
IplImage構造体情報の保存
マップのシーケンスを保存
IplImage構造体情報の読み込み
マップのシーケンスを読み込む
K-means法によるクラスタリング
クラスタリングによる減色処理
エッジの検出
コーナーの検出
並進移動のためのピクセルサンプリング
回転移動のためのピクセルサンプリング
画像のサイズ変更
画像のアフィン変換(1)
画像のアフィン変換(2)
画像の透視投影変換
全方位画像の透視投影変換
モルフォロジー変換
平滑化
ユーザ定義フィルタ
境界線の作成
画像の二値化
画像の二値化(大津の手法)
画像ピラミッドの作成
画像ピラミッドを用いた画像の領域分割
平均値シフト法による画像のセグメント化
Watershedアルゴリズムによる画像の領域分割
輪郭の検出と描画
画像のモーメントを計算
ハフ変換による直線検出
ハフ変換による円検出
距離変換とその可視化
不要オブジェクトの除去
ヒストグラムの描画
ヒストグラム間の距離
二次元のヒストグラム
バックプロジェクションパッチ
ヒストグラムの均一化
テンプレートマッチング
形状のマッチング
点列を包含する矩形
輪郭領域の面積と輪郭の長さ
二つの矩形を包含する矩形
楕円のフィッティング
点列を包含する図形
動的背景更新による物体検出
snakeによる輪郭追跡(静止画)
オプティカルフロー1
オプティカルフロー2
オプティカルフロー3
Condensation
顔の検出
カメラキャリブレーション
歪み補正
マップを利用した歪み補正
サポートベクターマシン
画像の各ピクセル値を特徴ベクトルとしたSVMの学習
画像の各ピクセル値を特徴ベクトルとしたSVMによる物体検出
マウスイベントの取得
トラックバーの利用
カメラからの画像キャプチャ
動画としてファイルへ書き出す
ラベリング