楽譜アーカイブアプリ - その10 光学迷彩シミュレータ [考え中の問題]
こないだからなんとなくOpenCVで遊ぶのが続いている。いじってみてわかってきたんだけど、OpenCVはプロの使用に十分耐える高品質のライブラリだわ。APIもよく考えられている。こんなのがフリーでその上オープンソースだというのはすごい。僕が会社で測定器のプログラミングなんかを始めた頃にこんなのがあったらなあ。
このマネをするおもちゃアプリを作ってみよう。 どういうのかというと
しかし完璧に前景除去ができてしまうとすると、画面には何の変化もないので、人物の上に貼る背景の方にエフェクトをかける。それをさっきのコードブックを使ってリアルタイムにやる。エフェクトはOpenCVが持っているいろいろなエフェクトが選べるようにしよう。「攻殻機動隊」や「プレデター」の光学迷彩のように見えるようなエフェクトも、がんばれば作れるかもしれない。
こんども、だからどうした、というようなアプリだけどOpenCVの威力を簡単に知ることができる。
そんなことをしなくてもObjctive-C++というObjctive-CとC++を混在できる仕様をgccはサポートしているので無駄な苦労と言える。しかし
Objective-Cに書き換えて利用させてもらった部分は
4.2.4 光学迷彩シミュレータ
ちょっと古い話になるが、アニメ「攻殻機動隊」やハリウッド映画「プレデター」には光学迷彩を使うシーンがでてくる。アニメや映画では迷彩によって完全に背景と区別できなくなってしまうと、観客にも登場人物がわからなくなってしまう。そこで、人物は透明だけどわずかに屈折するとでもいうようなエフェクトがかけられて、人物が動くとその形にエフェクトも変形する、というような表現がとられていた。迷彩が動作して人物が背景に溶け込んでいるということを表現しながら、観客にはそれが迷彩であることがわかるしかけになっていた。光学迷彩のシーンは例えばこの1:31〜1:39や、このTralerの1:05あたり。このマネをするおもちゃアプリを作ってみよう。 どういうのかというと
- MacのiSightカメラから画像を撮る
- 何フレームか画像を背景として学習する
- 前景となる人物が入ってくるとその形に背景を切り抜く
- 切り抜いたところに学習したときの背景を貼る
しかし完璧に前景除去ができてしまうとすると、画面には何の変化もないので、人物の上に貼る背景の方にエフェクトをかける。それをさっきのコードブックを使ってリアルタイムにやる。エフェクトはOpenCVが持っているいろいろなエフェクトが選べるようにしよう。「攻殻機動隊」や「プレデター」の光学迷彩のように見えるようなエフェクトも、がんばれば作れるかもしれない。
こんども、だからどうした、というようなアプリだけどOpenCVの威力を簡単に知ることができる。
4.2.5 ソースコードの拝借
オライリーの本に書かれているソースはここから手に入る。コードブックを使った背景除去のコードは% ls -l ch9* -rw------- 1 decafish staff 6099 10 8 2008 ch9_AvgBackground.cpp -rw------- 1 decafish staff 2140 11 12 10:13 ch9_AvgBackground.h -rw-------@ 1 decafish staff 1232 10 8 2008 ch9_ClearStaleCB_Entries.cpp -rw------- 1 decafish staff 14442 10 8 2008 ch9_backgroundAVG.cpp -rw-------@ 1 decafish staff 1516 10 8 2008 ch9_backgroundDiff.cpp -rw------- 1 decafish staff 3173 10 8 2008 ch9_ex9_1.cpp -rw-------@ 1 decafish staff 6083 10 8 2008 ch9_watershed.cppこのあたりである。ch9_backgroundAVG.cppにmain関数がある。どれもC++で書かれているが、サンプルコードなので必要な変数はみんなグローバルになっているし、使い終わったメモリの掃除はあまりきちんとはされていない。そのせいでC++特有の言い回しはあまり出てこない。そこでこのコードのうち必要なものをObjective-Cに書き換えた。
そんなことをしなくてもObjctive-C++というObjctive-CとC++を混在できる仕様をgccはサポートしているので無駄な苦労と言える。しかし
- サンプルコードはC++のオブジェクトとして書かれていない(クラス定義はない)
- C++の言語仕様は複雑で、すぐ忘れてしまって混乱する
- Objective-Cに書き換えることでコードが何をやっているのか理解がはやい
- まとまった作業をObjective-Cのオブジェクトにする
- グローバルになっている変数をそれらのオブジェクトのインスタンス変数にする
- OpenCVのhighguiのかわりにCocoaを使う
- アプリがクロスプラットフォームである必要性はライブラリと比べれば低い
- highguiは基本的なオブジェクトしかサポートしておらず、UIはCocoaを利用するのが楽
- 僕は自分のアプリをWindowsで動作させることに興味がない
- どうせおもちゃアプリだし
Objective-Cに書き換えて利用させてもらった部分は
- コードブック法の実装
- ノイズ除去
- 前景部分の領域連結
2010-11-29 21:12
nice!(0)
コメント(0)
トラックバック(0)
コメント 0