SSブログ

楽譜アーカイブアプリ - その10 光学迷彩シミュレータ [考え中の問題]

こないだからなんとなくOpenCVで遊ぶのが続いている。いじってみてわかってきたんだけど、OpenCVはプロの使用に十分耐える高品質のライブラリだわ。APIもよく考えられている。こんなのがフリーでその上オープンソースだというのはすごい。僕が会社で測定器のプログラミングなんかを始めた頃にこんなのがあったらなあ。

4.2.4  光学迷彩シミュレータ

ちょっと古い話になるが、アニメ「攻殻機動隊」やハリウッド映画「プレデター」には光学迷彩を使うシーンがでてくる。アニメや映画では迷彩によって完全に背景と区別できなくなってしまうと、観客にも登場人物がわからなくなってしまう。そこで、人物は透明だけどわずかに屈折するとでもいうようなエフェクトがかけられて、人物が動くとその形にエフェクトも変形する、というような表現がとられていた。迷彩が動作して人物が背景に溶け込んでいるということを表現しながら、観客にはそれが迷彩であることがわかるしかけになっていた。光学迷彩のシーンは例えばこの1:31〜1:39や、このTralerの1:05あたり。

このマネをするおもちゃアプリを作ってみよう。 どういうのかというと
  1. MacのiSightカメラから画像を撮る
  2. 何フレームか画像を背景として学習する
  3. 前景となる人物が入ってくるとその形に背景を切り抜く
  4. 切り抜いたところに学習したときの背景を貼る
これで、人物が入ってきても、その人物が隠した形に背景を貼るのでちゃんと背景除去ができていれば人物は消えることになる。これは背景除去ではなく「前景除去」とでもいうものである。

しかし完璧に前景除去ができてしまうとすると、画面には何の変化もないので、人物の上に貼る背景の方にエフェクトをかける。それをさっきのコードブックを使ってリアルタイムにやる。エフェクトは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を使う
ということにした。せっかくクロスプラットーフォムなOpenCVなのにこういうことをするのはまじめなOpenCVのContributerからバカにされかねないが、まあ、
  • アプリがクロスプラットフォームである必要性はライブラリと比べれば低い
  • highguiは基本的なオブジェクトしかサポートしておらず、UIはCocoaを利用するのが楽
  • 僕は自分のアプリをWindowsで動作させることに興味がない
  • どうせおもちゃアプリだし
ので許してもらおう。

Objective-Cに書き換えて利用させてもらった部分は
  • コードブック法の実装
  • ノイズ除去
  • 前景部分の領域連結
の部分である。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

献立11/29献立11/30 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。