CvVideoWriter* cvCreateVideoWriter( char* filename, int fourcc, double fps, CvSize size, int is_color);

ディスク上にビデオを書き込むWriterを生成する.

引数

  • filename:char*型のファイル名
  • fourcc:int型のFOURCC.詳細は後述
  • fps:double型のfps
  • size:CvSize型の画像の大きさ
  • is_color:int型のカラービデオのフラグ

返り値

  • 成功した場合,CvVideoWriterのポインタを返す.
  • 失敗した場合はNULLを返す.

void cvReleaseVideoWriter( CvVideoWriter** writer );

Writerを解放する.

引数

  • writer:CvVideoWriter**型のWriter

返り値

  • void型なのでなし

解説

  • is_colorのデフォルト値は1
  • 30fpsビデオも作れるが,再生が乱れるので,29.97にすること.
  • Releaseすることでファイルが完成.
  • その途中は書き込み権限をプログラムがもつので,ファイルにアクセスできない

fourccについて

  • fourccに-1を入力すると出力するコーデックの種類を選択するダイアログが出現する.*1
  • 以下の様にCV_FOURCC()を利用すると,選択でなく,出力するコーデックを指定できる.
    CV_FOURCC('D','I','V','3')
  • OpenCVではFOURCCは以下のように4バイト長の変数となる.
    #define CV_FOURCC(c1,c2,c3,c4) (((c1)&255) + (((c2)&255)<<8) + (((c3)&255)<<16) + (((c4)&255)<<24))
  • FOURCCはcase insensitive.大文字小文字は区別しない.
  • ' '(半角スペース)も有効なFOURCCなので,スペースを混ぜることで3桁のFOURCCも可能.
  • 非圧縮AVIは'D', 'I', 'B', ' 'らしい.*2
  • FOURCCはもともとはデータ(ビデオに限らず)の形式を指定する4文字のキャラクターを意味するFour Character Codeの略.*3
  • FOURCCとcodecの対応は以下参照*1
Cinepak Code by RadiusCVID
Intel 4:2:0 Video V2.50失敗
Intel Indeo(R) Video R3.2IV32
Intel IndeoR Video 4.5IV41
Intel IYUV codeIYUV
Microsoft RLE失敗
Microsoft Video 1MSVC
Microsoft H.263 Video Codec失敗
Microsoft H.261 Video Codec失敗
IndeoR video 5.10IV50
Canopus Software DV Decompressor失敗
Microsoft MPEG-4 Video Codec V1MPG4
Microsoft MPEG-4 Video Codec V2MP42
Microsoft MPEG-4 Video Codec V3MP43
DivX(R) 6.1 Codec (1 Logical CPU)DIVX*2
DivX(R) 6.1 YV12 Decoder?
DivX(R) 6.6.1 Codec (2 Logical CPU)DIVX*2
DivX(R) 6.6.1 YV12 Decoder失敗
Microsoft Windows Media Player Video 9?
Ut Video Codec Suite*3*4*5ULRG
Huffyuv*6*7HFYU
非圧縮AVIDIB

OpenCV2.0以降のvideoWriterについて

  • OpenCV1.1 時代は無かったと思うんだけれど,OpenCV2.0以降でFOURCC指定時に強制終了することがたまにある.
  • 少なくとも2.0と2.1では'MPG4'や'MP42'を指定するとOpenCVのエラーウィンドウが出ることなくプログラムが強制終了になる
  • ソースコードを眺めるにあまり変わってないのだが,多分ビルド時の細かい指定のせいで挙動が1.1以前と2.0以降で違うっぽい.
  • 参考サイトに説明があるが,どうやら
    • ffmpegが使えるか試す(*)
    • ffmpegが使えなかったらVFWで読み込む
  • というプロセスがあるらしく,2.0以降では(*)時点で不明なFOURCCだとffmpeg側で強制的に死ぬらしい
  • ちょっと説明が怪しいが・・・
  • 読み込みではそんなこと無いので,書き出し用の関数を下記の様に書き換えるとベター
  • 書き換えるファイルはcvcap_w32.cpp (OpenCV2.1では212行目)
    • 変更前
      1. CvVideoWriter* cvCreateVideoWriter_Win32( const char* filename, int fourcc,
      2.                                           double fps, CvSize frameSize, int isColor )
      3. {
      4.     CvVideoWriter_FFMPEG_proxy* result = new CvVideoWriter_FFMPEG_proxy;
      5.  
      6.     if( result->open( filename, fourcc, fps, frameSize, isColor != 0 ))
      7.         return result;
      8.     delete result;
      9.  
      10.     return cvCreateVideoWriter_VFW(filename, fourcc, fps, frameSize, isColor);
      11. }
    • 変更後
      1. CvVideoWriter* cvCreateVideoWriter_Win32( const char* filename, int fourcc,
      2.                                           double fps, CvSize frameSize, int isColor )
      3. {
      4.     //CvVideoWriter_FFMPEG_proxy* result = new CvVideoWriter_FFMPEG_proxy;
      5.  
      6.     //if( result->open( filename, fourcc, fps, frameSize, isColor != 0 ))
      7.     //    return result;
      8.     //delete result;
      9.  
      10.     return cvCreateVideoWriter_VFW(filename, fourcc, fps, frameSize, isColor);
      11. }
  • つまり,ffmpegで書き出すのをあきらめ,のっけからVFW1本に絞る作戦だ.
  • これでビルドしなおせばよい.
  • もともと,VFWでの書き出しはVFWでの読み込みに比べて不満は小さい.
  • ffmpegを無理に使おうとして不安定になるぐらいならVFWで書き出すだけで何ら問題はない.
  • しかし,ソースコードを眺めるだけだと不可解な現象だが,結果だけ見るとffmpegをコメントアウトして無事動くんだよなぁ・・・
  • 参考:OpenCVのcvCreateVideoWrite()でエラーが出る件 - Kato Keiske's Website

サンプルコード

  1.  #include <cv.h>
  2.  #include <highgui.h>
  3.  
  4.  void main(){
  5.    CvVideoWriter *writer;
  6.    IplImage *image;
  7.    writer = cvCreateVideoWriter( "result.avi", -1, 29.97, cvSize(IMAGE_WIDTH, IMAGE_HEIGHT));
  8.    while(end){
  9.      image = SomeKindOfProcess( some, parameters);
  10.      cvWriteFrame(writer, image);
  11.    }
  12.    cvReleaseVideoWriter( &writer);
  13.  }

実体ファイル

OpenCV1.1以前

  • otherlibs/highgui/highgui.h
  • otherlibs/highgui/cvcap_vfw.cpp (Windowsの場合)

OpenCV2.0以降

  • include/opencv/highgui.h
  • src/highgui/cvcap_w32.h (cvcap**.hはたくさんあって良くわからない)

ジャンル:OpenCV:OpenCV 1.0:OpenCV 1.1:OpenCV 2.0:OpenCV 2.1準拠


*1 Windowsのみ?
*2 参考:opencv.jp http://opencv.jp/sample/video_io.html
*3 参考:http://en.wikipedia.org/wiki/FourCC
*1  マイクロソフトに登録されている 4 文字コード (FourCC) 情報について, 2005-01-25更新, 2013-04-15閲覧
*2  インストールされているDivXの最新バージョンでエンコーディングする
*3  Ut Video Codec Suite - k本的に無料ソフト・フリーソフト, 2013-04-15閲覧
*4  Index of /archive/utvideo, 2013-01-13更新, 2013-04-15閲覧
*5  或るプログラマの一生, 2013-04-15閲覧
*6  Huffyuv, 2013-04-15閲覧
*7  Huffyuv - k本的に無料ソフト・フリーソフト, 2013-04-15閲覧

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-04-15 (月) 17:09:58 (1684d)