- 追加された行はこの色です。
- 削除された行はこの色です。
- ビデオの出力 へ行く。
#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の対応は以下参照¬e{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¬e{divx-latest:インストールされているDivXの最新バージョンでエンコーディングする};|
|DivX(R) 6.1 YV12 Decoder|?|
|DivX(R) 6.6.1 Codec (2 Logical CPU)|DIVX¬e{divx-latest};|
|DivX(R) 6.6.1 YV12 Decoder|失敗|
|Microsoft Windows Media Player Video 9|?|
|Ut Video Codec Suite¬e{utvideo-intro:[[Ut Video Codec Suite - k本的に無料ソフト・フリーソフト>http://www.gigafree.net/media/codec/utvideocodecsuite.html]], 2013-04-15閲覧};¬e{utvideo-binary-distribution:[[Index of /archive/utvideo>http://umezawa.dyndns.info/archive/utvideo/]], 2013-01-13更新, 2013-04-15閲覧};¬e{utvideo-author-official:[[或るプログラマの一生>http://umezawa.dyndns.info/wordpress/]], 2013-04-15閲覧};|ULRG|
|Huffyuv¬e{Huffyuv-official:[[Huffyuv>http://neuron2.net/www.math.berkeley.edu/benrg/huffyuv.html]], 2013-04-15閲覧};¬e{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]]準拠