画像処理ソリューション
これを見れば画像処理の入門から基礎~応用まで全てがわかるのを目指して!
   
翻訳(Translate)

プロフィール

Akira

ニックネーム:Akira
東京都の町田事業所に勤務
画像処理ソフトの開発を行っています。リンクフリーです!
詳細プロフィールは こちら
お問い合わせは、こちら↓

【補助HP】
画像処理ソリューションWeb版 【Newブログ】
イメージングソリューション

スポンサーリンク


カテゴリ

最近のコメント

カレンダー

05 | 2017/06 | 07
S M T W T F S
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

趣味のブログ

iPhone萬歳!
iPhoneの情報いろいろ。
ブログ学習帳
ブログ、SEO、アフィリエイト情報など(まだまだこれから)
俺流クラフト日記
ハンドメイド作品の記録(現在、放置中)

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

【OpenCV】AVIファイル保存

メインページOpenCV

画像データ(IplImage)をaviファイルに保存するにはOpenCVを使うと簡単に行う事ができます。
まずは、以前、USBカメラの画像取得で使用したサンプルをベースにaviファイル保存を追加したサンプルを紹介します。

IplImage *frame = NULL;

//カメラの初期化(カメラの選択)
CvCapture *capture = cvCaptureFromCAM(0);

//画像サイズ
int Width  = 640;
int Height = 480;

//取込サイズの設定
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH,  Width);
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, Height);

//ウィンドウの表示
cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);

//aviファイル設定
double fps = 5.0;
CvVideoWriter* VideoWriter = cvCreateVideoWriter("avifile.avi", -1, fps, cvSize(Width, Height), 1 );

while (1) {
     //フレーム画像の取込
     frame = cvQueryFrame (capture);

     //1画面分の書込
     cvWriteFrame(VideoWriter, frame);
              
     //画像の表示
     cvShowImage ("Capture", frame);
              
     //キー入力待ち(Escキーで終了)
     if (
cvWaitKey (1000.0 / fps) == '\x1b')
          break;
}

//解放
cvReleaseCapture (&capture);
cvDestroyWindow ("Capture");
cvReleaseVideoWriter(&VideoWriter);

上記サンプルではcvWaitKey関数で指定したフレームレート間隔で画像を取得するように待ち時間を調整しています。(処理時間は無視していますが。)

aviファイルの保存には3つの関数を使うのみで可能となります。
以下、関数の詳細です。

cvCreateVideoWriter関数

動画ファイルを指定しキャプチャを初期化します。

CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps,
                                                              CvSize frame_size, int is_color=1 );
 
filename動画のファイル名を指定します。
fourcc圧縮コーデックをFOURCCで指定します。
fps動画のフレームレート(1秒あたりのフレーム数)を指定します。
frame_sizeビデオフレームのサイズ
is_color0の場合:グレー画像
0以外の場合:カラー画像
戻り値作成したビデオライタ構造体

forcc = -1とすると下図のようなビデオ圧縮の選択ウィンドウが表示されます。
FOURCC

このウィンドウを表示させたく無い場合はFOURCCを使って直接していします。
例)VideoWriter = cvCreateVideoWriter("avifile.avi", CV_FOURCC('P','I','M','1'), fps, cvSize(Width, Height), 1 );

mpeg1の場合: CV_FOURCC('P','I','M','1')
非圧縮の場合:  CV_FOURCC('D','I','B',' ')

FOURCCの詳細については以下のサイトを参照下さい。
http://support.microsoft.com/kb/281188/ja
http://www.fourcc.org/codecs.php

cvWriteFrame関数

画像を1フレーム分の画像として追加保存します。

int cvWriteFrame( CvVideoWriter* writer, const IplImage* image );
 
writercvCreateVideoWriter関数で作成したビデオライタ構造体を指定します。
image追加する画像をIplImageで指定します。

cvReleaseVideoWriter関数

作成したビデオライタ構造体を解放します。

void cvReleaseVideoWriter( CvVideoWriter** writer );
 
writercvCreateVideoWriter関数で作成したビデオライタ構造体を指定します。

この関数で取得したIplImageは解放や変更はしてはいけないとのこと。
取得した画像を処理する場合は、取得したIplIamgeをcvCloneImageやcvCopyでコピーしてから処理した方が良さそうです。

その他

上記サンプルプログラムでは、USBカメラからの画像データの取得が遅いせいか?フレームレートが5フレーム程度でしか保存する事ができませんでした。
各フレームの画像データを別途用意して、AVIファイルの保存するようなプログラムの場合は、より大きなフレームレートを指定する事が可能です。ただし、必要以上に大きくしてもAVIファイルの再生ができなくなるので、30fps程度を指定すると良いと思います。
また、OpenCVで作成されるAVIファイルのサイズには2GBの壁が存在しているようです。
そのため画像サイズが大きく、非圧縮でAVIファイルに保存しようとすると、AVIファイルが2GBを超えるフレーム数を超えるとAVIファイルに保存できなくなるのでご注意下さい。

関連記事

【OpenCV2.x】USBカメラ(Webカメラ)の画像取込
【OpenCV】動画ファイル(aviファイルなど)の再生

これで動画系の基本処理、動画の取得、保存が出来るようになったので、ユニクロカレンダーのような動画も作成することができるかも?
また、カメラからの画像の取得やAVIファイルの操作などをOpenCVで行うにはかなりの制限があるので、AVIファイルの場合はOpenCVで操作ができるファイル形式に変換するなどして、OpenCVで出来る事を考えた方が無難です。
どうしても細かい制御などを行いたい場合は、やっぱりDirectShowを使う事になりますが、OpenCVに比べると、かなり難しくなるので、私はちょっと挫折中...
 
 


Loading...
スポンサーリンク

この記事に対するコメント
Re: 補足
自己解決できたようで、よかったです。
OpenCVの動画系の処理は、簡単といえば簡単なのですが、あまり凝った事はできないので、過度に期待しない方がベターです。
しかも、はめられやすいのが、関数の引数でフレームレート等の設定があっても、実際には設定できない関数(引数)もあるので、注意が必要です。
おかしいな?と思ったら、OpenCVのソースコードを眺めてみるのもオススメです。
【2011/06/21 19:44】 URL | Akira #- [ 編集]

補足
すみません、解決されました。

USBカメラを変更したら、保存された*.aviファイルは録画時と同じスピードで、再生されました。


【2011/06/21 14:54】 URL | 西子 #- [ 編集]

*.aviの再生について
お世話になります。このHPを参考させていただきます。

CvVideoWriter* VideoWriter = cvCreateVideoWriter("avifile.avi", -1, fps, cvSize(Width, Height), 1 )
を使って,作成された*.aviファイルのプロパティをみると、フレーム率は1518フレーム/率になっています、実際プログラムにはfps=15。しかも、*.aviを再生する時にも、録画時と比べて、結構速い。原因は何ですか?ちなみに、USBカメラの動画フレームレート15=fpsです。

よろしくお願いします。
【2011/06/21 14:30】 URL | 西子 #- [ 編集]


この記事に対するコメントの投稿














管理者にだけ表示を許可する


この記事に対するトラックバック
トラックバックURL
→http://imagingsolution.blog107.fc2.com/tb.php/223-6db07985
この記事にトラックバックする(FC2ブログユーザー)

現在の閲覧者数: / 合計