« ぼくを取り囲む、心配事のスレッド | 最新のページに戻る | [告知] 1/20(木)に南山大学哲学セミナーでトークします »
■ OpenFrameworksいじってみた
Beyond Interaction ―メディアアートのためのopenFrameworksプログラミング入門 のコード打ち込んでOpenFrameworks動かしてみた。アドオンでBox2d(物理エンジン)とOpenCV(のうち輪郭検出の機能)を組み合わせることで、webカメラから取り込んだ画面上に玉を飛ばしてインタラクションすることができる。
著者の田所氏によるデモ (on Vimeo)。これをわたしも自分の環境でも動かしてみたというわけです。玉の半径を大きめに設定してやると、風船で遊んでいるみたいなことができる。家でやってたらさっそく子どもたちに奪われた。せっかくなので画面をキャプチャーした映像を作ってみた(手の出演:次男)。YouTube貼り付けのテストを兼ねてます。
fpsは12とかしか出てないけど、初めのうちは60くらい行ってた(DebugではなくてReleaseでビルドしてappを作ってある)。これは画面キャプチャーしているうちにどんどん遅くなってきたため。
この本は「メディアアートのための」と銘打っているけれども、私のようにC++の入り口のところでずっとウロウロしてきた人間にとってはちょうどよい難易度のC++入門なのだった。たとえば、多数の円を描画させるということになると、ちゃんと円のクラスを作って、そのインスタンスを作って、あとはbox2d.updateで勝手に落下させたりバウンドさせたりすることができるようになる。クラスを作ったり、vectorでそれを保存しておいたりすることの便利さがわたしにもよく分かった。
「クラスにするとコードの保守性が良くなる」とか言われてもさっぱりありがたみがわからなかったんだけど、「クラスの定義を読んでヘッダだけ取り込んでおけば人の書いたコードを中身に立ち入らずに使えるようになる」と言われると納得する。わたしの場合。
コードはopenframeworks.jpからダウンロードすることができる。解凍してできる"3-4_H"のフォルダの中にある。
ここでやってることはほぼ本の丸写しなのでとくに言うことはないのだけど、Xcode上でコンパイルしてみて引っかかった点としては、UTF-8で書かれたコードをXcodeで開くと文字化けする(<-Xcodeの設定分かってないオレ)。あとBox2dのアドオンがコンパイルエラーを起こす。問題究明のためにincludeすらしない状態でビルドして確認してみた。(<-デバッガ使いこなせてないw <-というかincludeされてないのにどうしてコンパイルされるのか分かってない <- Xcode使いこなせてない)
そうしたら、どうやらofxBox2dBaseShape.hで定義されているaddImpulseForce(ofPoint pt, ofPoint amt=1.0)というのに文句が付いているらしい。"default argument for parameter of type 'ofPoint' has type 'double'"ってエラーが出る。この関数はどこでも呼ばれてないのでamt=1.0をamtとだけしたらコンパイル通った。
ofPointは座標[x,y,z]を格納するためのものなのに1.0が代入されたから文句が出たのかと思ったんだけど、g++だとコンストラクタがオーバーロードされてamt.xに1.0が代入されるからエラーは起こらないとのこと。(Thanks to kohskeさん) というわけでXcodeの動作によるのか、私がなんかアホな設定してるからなのかはよく分からないけど、とりあえず問題解決したのでこれで良しとする。
ところでそもそもなんでこのへんを調べはじめたのかというと、C++で書かれたオープンソースのアイトラッカーのコードを探していて、ALSになったグラフィティライターのためにopenFrameworksで開発されたEyeWriterというのを見つけたのがきっかけだった。
いぜんそっちについても試行錯誤したことがあるのだけれど、未解決なのはカメラからの入力に関して。iSightからの映像をキャプチャするのはデフォのままでできる。Point GreyのFirefly MWを買っておいたのでそいつからの映像を取りたいのだけれど、Point GreyのSDKはMacに対応していない。libdc1394とか汎用のドライバだと不完全な映像(カラーがモノになったり)しか取れない。
今回はとりあえず本の丸写しで動作させてみただけだけど、かなりこれで心理的障壁が下がったので、次にいじるときにはEyeWriterのコードを読んでみることにしよう。アイトラッカーの部分はtrackingManager.hから読み始めればよいってことがわかった。以前コード読んだときはさっぱり手掛かりさえつかめなかったのだからまあ進歩したと言える。
本当にいちばんやりたいのは、saliency mapの計算をアドオン化して利用すること。いまのiNVTはそういう発想はなくて、ぜんぶ自前で用意する(入力系から出力系まで)。このため、コンパイルするためにはぜんぜんどうでもいいライブラリまでインストールする必要があって、現状ではLinuxでないと事実上コンパイルできなくなっている。
かといって自前でsaliency mapをインプリメントするのもいい方法とは思えない。(比較対象としてインプリするのではなくて、実際に活用するつもりならば。) 自己流の解釈ではなくて、いま動いているコードを使った方がよい。というのも、なんか細かいパラメータ部分でチューンされているということが経験上わかったので。
だから、いま動いているコードからどのクラスを使えばいいのか見つけて、そいつをヘッダでincludeして、必要な部分のコードだけaddonで参照できるようにしておけばよい。問題はiNVT部分が巨大すぎてどこが必要なコードなのか分からんこと。なんかツールを使えばよいのだろうけど。(emacsでetags使うのが推奨されているけどよく分からん。IDE使わせてほしい。) ともあれ、もうちょっとやりたいことが絞れてきたらLaurentに聞いてみることにしよう。
たぶん本当はopenCVから呼んでやるというのが正しいのだろうと思う。OpenCVはどんどんバージョンが上がってコンパイルのしかたとかもゴンゴン変わるので追いつけてない。いまはとりあえずofxOpenCVいじってもうすこし慣れてゆくことにする。
そんなこんなでこっちの方向はじりじりと進めているところなんだけど、たぶんどっかで風穴が空いて、もっと生産的にいけるはず。