2014/10/03 ■ Leap Motionを使ってOculus Riftの個人調整値「IPD(瞳孔間距離)」を測定してみる Xでつぶやくこのエントリーをブックマークに追加このエントリーを含むはてなブックマーク


「手を認識する」デバイスLeap Motion。発売当初はいろいろとトラブルがあったり認識精度がいまひとつだったりでしたが、いまや日本でも普通に家電量販店や通販で売っており、認識精度もSDK Version 2から飛躍的に良くなりました。そして、最近は「Leap Motion VR デベロッパー・マウント」としてOculus Rift前面にLeap Motionを装着するアダプターや、それを使った開発キットなどがLeap Motion純正として登場しています。
この「Leap MotionとOculus Riftの組み合わせ」が実によくできてまして、使ってみて「この組み合わせは今後定番になる可能性があるな」と感じました。「定番の組み合わせ」ということはそれはすなわちその組み合わせをインフラとして使える状況になるということでもあり、それはつまり「手をVR空間内に登場させる」という使い方以外も考えてみる価値があります。
そう、そんなわけで、「Leap Motionで瞳孔間距離を測定する」ということを試してみることにしました。

今回の経緯については、10月1日に開催されたTokyo Motion Control Network vol.9で発表しましたのでまずはその資料を貼っておきます。


















まあだいたいこのスライドで言いたいことは言っているのですが、
  • Oculus Riftの個人設定として「IPD(瞳孔間距離)」を設定することができ、設定するとVR体験の質があがる
  • しかしIPD(瞳孔間距離)は測定がちょっとめんどくさい
  • Leap Motionは言ってみれば近接・広角・赤外のステレオカメラであり、ひょっとすると画像処理でIPD(瞳孔間距離)が計測できるんじゃなかろうか
  • Oculus RiftとLeap Motionの組み合わせが「定番」になるのなら、「Oculusを装着する前にちょいとLeapを覗き込んでもらう」だけでIPD測定・設定できる…というコンポーネントをつくりこれも「定番」にしてしまえば、Oculus体験全体の質があがるのでは?
みたいなことを考えたわけです。

で、考えただけじゃできるかどうかわからないので、作ってみました。
Leap Motionを覗き込むと、瞳孔の位置を判定して瞳孔間距離を測定するデモです。Unityのプロジェクトファイルをここ(IPDCalcurator_20141003.zip)に置いておきます。Windowsビルドはこちら。どちらも最新の開発者向けLeap Motion v2がインストールされていないと動作しません。

まだ本実装は「コンセプトとしてこういうのはどうか」という段階で、正直実用レベルに達していません

  • 瞳孔の判定条件が結構シビア。今回の実装ではOpenCVを使いLeap Motionから得られた赤外線画像を2値化、領域を調べて「広く白い領域(顔)の中の小さい黒い領域(瞳孔)」を瞳孔として判定しています。実際やってみると、Leap Motionの画角が非常に広角で瞳がうまく判定できなかったりします。アルゴリズム要検討。
  • 測量の値が変かも。紙にマークを描いて測定するとだいたいきっちり描いた間隔そのとおりの数字が測定できるので、2点間の距離を計算する方法はあってる…と信じたいのですが…。自分のIPDを測定すると50mmになったり73mmになったりする。なんでじゃー
  • Oculus Rift SDKと同居する方法がわからない。Oculus RiftアプリにPrefabいっぱつぶち込んだらIPD測定モードが追加される、みたいなことにしたいのですが、Oculus RiftのSDKが生きている状態で同居させるとうまく動かない…

まあ、とはいえ「Leap Motionを『手を撮る』以外の用途に使う」可能性を感じていただければ嬉しいです。って、自分ぶっちゃけLeap Motionトラウマがあってあんまり好きじゃなかったりするんですけどね!