質問: 動画処理のライブラリについて 現在windowsのvc++で動画ファイル(.avi)に画像処理を行いたいと思っています。 もう少し具体的に述べますと、.aviファイルを読み込み、その映像にエッジ抽出や差分画像抽出などの画像処理を施して、画像処理された新たな.aviファイルを出力するというものです。 しかし、1から画像処理プログラミングを行うほどの知識もなく、どうすれば...と思っていたところ、opencvなど画像処理ライブラリというものがあることを知りました。 それを用いて.bmpなどの静止画像のエッジを取ったりというような処理はなんとなくわかったのですが、.aviファイルなどの動画ファイルに対する画像処理の方法がよくわからないのです。 動画というものは静止画の集合なので、動画像処理は静止画像処理を連続的に行えばよいと耳にしたのですが、これは正しいのでしょうか? もし正しいのであれば、.avi動画ファイルにたいして連続的な静止画処理を行い、また.aviファイルを出力するということはopencvを用いてできるのでしょうか? また、そういったことが詳しく解説されている書籍や日本語サイトなどがあれば教えていただけませんでしょうか。 素人の質問ではありますが、皆様どうぞよろしくお願いいたします。
回答: ■opencvの調査結果 opencvはいけてる系でした。vfwもラップされてるようです。 読み書きしながら再生するのはこんな感じでできました。 // // test.cpp // #include "highgui.h" #include "cvcam.h" #pragma comment (lib, "highgui.lib") #pragma comment (lib, "cvcam.lib") cvvideowriter* writer; void mycallback(iplimage* image) { /* imageに対してなんか処理 */ ::cvwriteframe( writer, image ); } int apientry winmain(hinstance hinstance, hinstance hprevinstance, lpstr lpcmdline, int ncmdshow ) { cvsize size; size.width = ***; size.height = ***; writer = :cvcreatevideowriter("c:\\***out.avi", -1, // 出力コーデックをダイアログで選ばせる系 (double)***, // fps指定 size, // サイズ 1 // カラーで ); ::cvcamplayavi("***.avi", ::getdesktopwindow, ::getsystemmetrics(sm_cxscreen), ::getsystemmetrics(sm_cyscreen), mycallback); ::cvreleasevideowriter(&writer); return 0; } ひょっとしたらcinepackとかキーフレーム入れて差分をとる系のコーデックだと、これではうまくいかないかもしれません。(vfwのときは何これっていうかんじのdibしかとれませんでした。) そのときはメモリ上にバックバッファを用意して、そこにカリカリ描画して、それを値コピーしてきたものに処理かけていくほうがいいかも。