うちにはXBoxなど無いのだけど、Kinectは入力デバイスとして大きな可能性をもっていると思う。ちなみにこれが今年の3月に書いた随想なのだから、思ったより早く時代が来たのだと思う。まあこれはTEDの関連講演やProject Qatalなんかを見て思ったことだから、別に自分の考えが時代の先を行っていたわけでは全然ないのだけど。
Kinectはオープンソースのライブラリも開発されており、PCのみで遊ぶことが出来るし、3Dカメラで手軽に遊べるというのは面白い。そんなわけで、Kinectはずっと興味深く眺めていた。先日まで忙しくてそれどころではなかったのだけど、時間的に余裕ができたのでようやく買ってきたというわけだ。
さて、そんなKinectをPCから操作する方法は、主に2つあるようだ。ひとつはXBoxのコントローラを提供しているPrimeSenseが公開しているOpenNIで、もうひとつは賞金をかけて開発されたプロジェクトOpenKinectだ。ちなみにOpenKinectで公開されているドライバはlibfreenectという名前だ。
どちらもgithubで公開されているオープンソースのプロジェクトだ、と言いたいところだけど、実際にはどちらもUSBドライバと基本的な入力の受信のみがオープンソースで公開されている。OpenNIにはPrimeSenseのミドルウェアが含まれており、これは人体の認識など、OpenNIデバイス(Kinectもその一つだ)からの入力情報から人体の動きなどを算出できるもので、より高水準のアプリケーションの作成が可能になるが、これがオープンソースではない。そしてOpenKinectには、まだこのミドルウェアに相当するものが存在しない。
また、サポート対象のプラットフォームがだいぶ異なっていて、libfreenectは主にLinuxを対象にしていて、win32はまだ正式にサポートされていない。OpenNIはWindowsとUbuntu Linuxのみで、PrimeSenseのミドルウェアがUbuntuのみということもあってか、うちのOpenSUSEではどうも動作しない(エラーメッセージをwebで探したら、異なるパッケージのライブラリにlddできないのでなないか等の指摘があって、要するにUbuntuでないとダメそうな感じだった)。仕方ないので、Windows上ではOpenNI、Linux上ではlibfreenectを使用して出来る範囲で遊んでいる。
実のところ、今はOpenKinectのサイトでは世界中で行われているハックを見られることもあって、libfreenectの方が興味深い。日本ではOpenNIの方が出来ることが多そうだというだけでそちらが話題になることが多いようだ。libfreenectのビルドは10分とかからず動かすことが出来たが、WindowsへのOpenNIの正しいインストールには1時間以上かかった上に、user trackingがまだ正常に動作しない。
今日はほぼ初めて真面目にKinectハックを見て回ったので、それで分かったことを他にも列挙してみよう。
- 日本で話題になっているMikuMikuDanceのmotion captureはOpenNIベース(これはwindowsアプリなので当然か)。日本ではOpenCVやARToolkit連携などでもこっちがよく見つかる。
- 逆にlibfreenectに基づいているものとしてDepthJSなどがあるが、これにもOpenCV連携が含まれている。DepthJSはgainerのFlashドライバと似たような構造で、ローカルで動作するtornadoをサーバに、chrome/safari extensionをクライアントにして(WebSocketsで)通信するようだ。
- OpenNIにもlibfreenectにもいくつかのforkがあって、それぞれ目的に合ったものを探す必要がありそうだ。たとえばOpenNIで必要となるPrimseSenseのWindows版ドライバはgithubのmaster上には存在しない(これは他の人が日本語でもまとめている通り)。libfreenectでもC#ラッパーなどは他の人のforkが一番進んでいるようだ(今日見た感じではメインリポジトリのunstableブランチと変わらないようにも見えたが)。異なるものをインストールしても上手く動作しなかったり、インストールするドライバが見つからなかったりする。
- Kinectは小型なので、電源のある喫茶店などに持って行っていじることもできる(!)
W3CではHTML Media Captureという仕様がwebcam入力をAPIとして標準化しようとしているけど、2Dの動画が標準化される頃には、Kinectのような3D入力デバイスが普及しているかもしれない。まあ、さすがにそれは無いだろうか。
しかし遊んでいてふと気づいたのだけど、OpenCV連携で遊んでいるだけでは3Dカメラらしいことを何もしていない。もっとドキュメントの類を読んで、何が出来るのかを勉強したほうが面白そうだ。