藤沢市遠藤周辺で「映像プログラミング」といったら、間違いなくOpenCVを薦められます。OpenCVは便利で簡単な素晴らしいライブラリですが、いくつか不便な点もあります。
OpenCVを使った実装の問題点
1. インストールが面倒
OpenCVはOS標準のライブラリではないので、別途インストールが必要です。finkやMacPorts等を使って自動インストールすることもできますが、インストールには長い時間がかかる上、バージョンによってはインストールに失敗する、特定の機能が正常に動かない、等のトラブルが珍しくありません。Snow Leopardが登場した直後は、至る所でOpenCVに関するトラブルで困る人達がいました。
2. OSの他の機能との連携が厄介
OpenCVはクロスプラットフォームで、簡単なプログラムを作るだけであればとても短いコードで実装できます。そのかわり、UIをリッチにしようとしたり、OSの様々な機能と連携させたりするのは容易ではありません。「ファイルを保存する」ダイアログを表示させるだけでも一苦労です。
3. 細かい指定ができない
OpenCVのAPIは非常に簡素で汎用的な形になっているので、キャプチャ時やムービー出力時に細かい設定をすることができません。そのせいで不要な計算負荷がかかってしまったり、ムービーファイルのサイズが膨大になってしまう問題等に遭遇することがあります。
つまり、OpenCVはプロトタイプ作成の段階ではよいのですが、ツールとして完成度を上げようとしてくると、上記の点がストレスになってきます。
OS XとQTKit
Mac OS Xには標準で強力なマルチメディア関連のAPIが用意されています。画像処理にはCore Image、サウンドはCore Audio、そして映像関連ではQTKit(QuickTime)というフレームワークが用意されており、なにもしなくても標準で使う事ができます。OpenCVとは目的が違っていますが、映像プログラミング(特にツールとして)をするための選択肢としては有効です。
映像には、このうちQuickTimeの機能がベースとなっているQTKitを使います。OpenCVと違い、顔認識等の機能はありませんが、カメラからの映像のキャプチャやムービーファイルの書き出し等ができます。
例:ムービーファイル作成
例えば、ムービーファイルの書き出し程度であれば下記のような形で書けます。
// ※QTKit.frameworkをリンクする必要があります #import...略... // 書き出し用のムービーを用意します(1) QTMovie *movie = [[QTMovie alloc] initToWritableData:[NSMutableData data] error:nil]; // 出力したい画像を用意します(2) NSImage* fooImage = [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForImageResource:@"foo.jpg"]] autorelease]; NSImage* barImage = [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForImageResource:@"bar.jpg"]] autorelease]; // 一コマずつ追加していきます(3) [movie addImage:fooImage forDuration:QTMakeTime(15, 15) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys: @"jpeg", QTAddImageCodecType, nil]]; [movie setCurrentTime:QTMakeTime(15, 15)]; [movie addImage:barImage forDuration:QTMakeTime(15, 15) withAttributes:[NSDictionary dictionaryWithObjectsAndKeys: @"jpeg", QTAddImageCodecType, nil]]; [movie setCurrentTime:QTMakeTime(30, 15)]; // ファイルとして出力します(4) [movie writeToFile:@"foo.mov" withAttributes: [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:QTMovieFlatten] error:nil]; [movie release];
OpenCVを使った実装と違い、シンプルなObjective-Cのコードでムービーファイルを出力することができます。
QTKitにはムービーを管理するためのQTMovieクラスがあります(1)。QTMovieクラスには「今から何秒間、この画像を表示する」という直感的でわかりやすいaddImage:forDuration:withAttributes:メソッドがあります(3)。ここでは表示したい画像をNSImageの形で渡します(2)。ファイルへの書き出しもNSData等同様にwriteToFileメソッドを呼ぶだけです(4)。
少しわかりにくい要素としては、まず時間の指定があります。(3)では画像を表示する時間(Duration)と時間を進める(setCurrentTime)時に、QTMakeTimeという関数を使って時間を指定しています。簡単に言えば最初の引数がフレーム数、二個目の引数がfpsです。つまり、QTMakeTime(30, 15)は15fpsにおける30フレーム=2秒、ということになります。
ムービー書き出しの際にはQTMovieFlattenというオプションを渡していますが、これを指定しないとムービーファイル作成時にムービー内で表示している画像等のデータがコピーされなくなってしまいます。
QTKitを使うメリットとデメリット
QTKitを使った映像プログラミングにもメリット、デメリットがあります。
メリット1: すぐに使える、安定して使える
OS標準の機能として用意されているので、別途ライブラリ等をインストールする必要がなく、Xcodeさえあればすぐに使えます。また、OS標準の機能なので安定しています。
メリット2: 細かい部分の指定ができる
QTKitはQuickTimeのベース、つまりMac OS Xにおけるムービー関連の機能のベースとなっている技術なだけあって、コーデック等細かい指定ができるようになっています。
メリット3: OS Xの機能を活用できる
標準的なObjective-Cのコードであり、他のOSの機能との親和性が高いです。UI関連に限らず、GCDあるいはOpenCLとの組み合わせなど、ハードウェア性能を引き出しやすいです。
デメリット1: 画像認識の機能はない
画像処理関連の機能はCore Imageを使って書く事ができますが、OpenCVにある顔認識等の機能についてはさすがにOSの機能としては提供されていないので、使えません。
デメリット2: Objective-Cが苦手な人
Objective-Cに苦手意識が無い人にとってはQTKitを使った方が気持ちよいプログラムが書けますが、そうでない人にはC言語でかけるOpenCVの方が簡単に感じるかもしれません。
まとめ
というわけで、QTKitはOpenCVを置き換えるものではありませんが、映像プログラミングをMacでやる人はもっと使ってみればよいのになと思いポストしました。上述の通り、他のOS Xの機能と組み合わせるととても強力なので、気が向いたらそこらへんについてもそのうちポストしようかと思います。
「QTKitを使ったムービーの作成」への1件のフィードバック