#contents

*CvVideoWriter* cvCreateVideoWriter( char* filename, int fourcc, double fps, CvSize size, int is_color); [#g7e3e383]
ディスク上にビデオを書き込むWriterを生成する.

**引数 [#b69661c1]
-filename:char*型のファイル名
-fourcc:int型のFOURCC.詳細は後述
-fps:double型のfps
-size:CvSize型の画像の大きさ
-is_color:int型のカラービデオのフラグ
**返り値 [#zd01909e]
-成功した場合,CvVideoWriterのポインタを返す.
-失敗した場合はNULLを返す.

*void cvReleaseVideoWriter( CvVideoWriter** writer ); [#cbb13b5c]
Writerを解放する.

**引数 [#jc12b057]
-writer:CvVideoWriter**型のWriter

**返り値 [#l3ee2df3]
-void型なのでなし

*解説 [#o5bc79d2]
-is_colorのデフォルト値は1
-30fpsビデオも作れるが,再生が乱れるので,29.97にすること.
//俺は試したことないけれど.
-Releaseすることでファイルが完成.
-その途中は書き込み権限をプログラムがもつので,ファイルにアクセスできない


**fourccについて [#o4d503a3]
-fourccに-1を入力すると出力するコーデックの種類を選択するダイアログが出現する.((Windowsのみ?))
-以下の様に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と圧縮AVIは別物なので,非圧縮AVIの場合は'-1'を指定してダイアログから「非圧縮AVI」を選択するしかなさげ.
-非圧縮AVIは'D', 'I', 'B', ' 'らしい.((参考:opencv.jp http://opencv.jp/sample/video_io.html))
-FOURCCはもともとはデータ(ビデオに限らず)の形式を指定する4文字のキャラクターを意味するFour Character Codeの略.((参考:http://en.wikipedia.org/wiki/FourCC))

-FOURCCとcodecの対応は以下参照&note{fourcc-microsoft-recognition:[[マイクロソフトに登録されている 4 文字コード (FourCC) 情報について>http://support.microsoft.com/kb/281188/ja]], 2005-01-25更新, 2013-04-15閲覧};

|Cinepak Code by Radius|CVID|
|Intel 4:2:0 Video V2.50|失敗|
|Intel Indeo(R) Video R3.2| IV32 |
|Intel IndeoR Video 4.5| IV41|
|Intel IYUV code|IYUV |
|Microsoft RLE|失敗|
|Microsoft Video 1|MSVC|
|Microsoft H.263 Video Codec|失敗|
|Microsoft H.261 Video Codec|失敗|
|IndeoR video 5.10|IV50|
|Canopus Software DV Decompressor|失敗|
|Microsoft MPEG-4 Video Codec V1|MPG4|
|Microsoft MPEG-4 Video Codec V2|MP42|
|Microsoft MPEG-4 Video Codec V3|MP43|
|DivX(R) 6.1 Codec (1 Logical CPU)|DIVX&note{divx-latest:インストールされているDivXの最新バージョンでエンコーディングする};|
|DivX(R) 6.1 YV12 Decoder|?|
|DivX(R) 6.6.1 Codec (2 Logical CPU)|DIVX&note{divx-latest};|
|DivX(R) 6.6.1 YV12 Decoder|失敗|
|Microsoft Windows Media Player Video 9|?|
|Ut Video Codec Suite&note{utvideo-intro:[[Ut Video Codec Suite - k本的に無料ソフト・フリーソフト>http://www.gigafree.net/media/codec/utvideocodecsuite.html]], 2013-04-15閲覧};&note{utvideo-binary-distribution:[[Index of /archive/utvideo>http://umezawa.dyndns.info/archive/utvideo/]], 2013-01-13更新, 2013-04-15閲覧};&note{utvideo-author-official:[[或るプログラマの一生>http://umezawa.dyndns.info/wordpress/]], 2013-04-15閲覧};|ULRG|
|Huffyuv&note{Huffyuv-official:[[Huffyuv>http://neuron2.net/www.math.berkeley.edu/benrg/huffyuv.html]], 2013-04-15閲覧};&note{huvvyuv-introduction:[[Huffyuv - k本的に無料ソフト・フリーソフト>http://www.gigafree.net/media/codec/huffyuv.html]], 2013-04-15閲覧};|HFYU|
|非圧縮AVI|DIB|

**OpenCV2.0以降のvideoWriterについて [#n0f490ad]
-OpenCV1.1 時代は無かったと思うんだけれど,OpenCV2.0以降でFOURCC指定時に強制終了することがたまにある.
-少なくとも2.0と2.1では'MPG4'や'MP42'を指定するとOpenCVのエラーウィンドウが出ることなくプログラムが強制終了になる
-ソースコードを眺めるにあまり変わってないのだが,多分ビルド時の細かい指定のせいで挙動が1.1以前と2.0以降で違うっぽい.
-[[参考>http://kato.keiske.info/blog/2009/03/opencvcvcreatevideowrite.html]]サイトに説明があるが,どうやら
--ffmpegが使えるか試す(*)
--ffmpegが使えなかったらVFWで読み込む
-というプロセスがあるらしく,2.0以降では(*)時点で不明なFOURCCだとffmpeg側で強制的に死ぬらしい
-ちょっと説明が怪しいが・・・
-読み込みではそんなこと無いので,書き出し用の関数を下記の様に書き換えるとベター
-書き換えるファイルはcvcap_w32.cpp (OpenCV2.1では212行目)
--変更前
#geshi(c++,number=on,start=212){{
CvVideoWriter* cvCreateVideoWriter_Win32( const char* filename, int fourcc,
                                          double fps, CvSize frameSize, int isColor )
{
    CvVideoWriter_FFMPEG_proxy* result = new CvVideoWriter_FFMPEG_proxy;

    if( result->open( filename, fourcc, fps, frameSize, isColor != 0 ))
        return result;
    delete result;

    return cvCreateVideoWriter_VFW(filename, fourcc, fps, frameSize, isColor);
}
}}
--変更後
#geshi(c++,number=on,start=212){{
CvVideoWriter* cvCreateVideoWriter_Win32( const char* filename, int fourcc,
                                          double fps, CvSize frameSize, int isColor )
{
    //CvVideoWriter_FFMPEG_proxy* result = new CvVideoWriter_FFMPEG_proxy;

    //if( result->open( filename, fourcc, fps, frameSize, isColor != 0 ))
    //    return result;
    //delete result;

    return cvCreateVideoWriter_VFW(filename, fourcc, fps, frameSize, isColor);
}
}}
-つまり,ffmpegで書き出すのをあきらめ,のっけからVFW1本に絞る作戦だ.
-これでビルドしなおせばよい.
-もともと,VFWでの書き出しはVFWでの読み込みに比べて不満は小さい.
-ffmpegを無理に使おうとして不安定になるぐらいならVFWで書き出すだけで何ら問題はない.
-しかし,ソースコードを眺めるだけだと不可解な現象だが,結果だけ見るとffmpegをコメントアウトして無事動くんだよなぁ・・・
-[[参考:OpenCVのcvCreateVideoWrite()でエラーが出る件 - Kato Keiske's Website>http://kato.keiske.info/blog/2009/03/opencvcvcreatevideowrite.html]]

*サンプルコード [#o6873bb3]
#geshi(c++,number){{
 #include <cv.h>
 #include <highgui.h>
 
 void main(){
   CvVideoWriter *writer;
   IplImage *image;
   writer = cvCreateVideoWriter( "result.avi", -1, 29.97, cvSize(IMAGE_WIDTH, IMAGE_HEIGHT));
   while(end){
     image = SomeKindOfProcess( some, parameters);
     cvWriteFrame(writer, image);
   }
   cvReleaseVideoWriter( &writer);
 }
}}

*実体ファイル [#d6326a72]
**OpenCV1.1以前 [#y4f81684]
-otherlibs/highgui/highgui.h
-otherlibs/highgui/cvcap_vfw.cpp (Windowsの場合)
**OpenCV2.0以降 [#n74f40f7]
-include/opencv/highgui.h
-src/highgui/cvcap_w32.h (cvcap**.hはたくさんあって良くわからない)

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

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS