プログラミング: 2008年10月アーカイブ
指が認識できたら、これをポインティングデバイスとして利用します。
これで、普段僕らがやっている「手で掴む・離す」という作業をそのままUIとして利用できるので、より自然な操作が可能になるはずです。
--- < 概要 > ---
今回、「つまむ」という動作を検出するために、以下の2つが必要になりました。
・親指の判断
・指がくっついた状態でも手の領域が重ならないようにする
この問題を解決するために、親指に緑色のキャップを装着しました。
これで、指先に緑の領域がある場合は親指であると判定でき、さらに指がくっついた状態でも、キャップの緑が邪魔をして肌色領域が混ざるのを防ぐことができました。
ここで指がくっついた状態では、親指じゃない方の指が親指だと判定される現象が発生しましたが、そのときの2つの指の座標はほぼ同じになるので、あまり問題ありませんでした。
ポインティングのために行った処理を説明します。
1.指を認識する
2.親指を探す
3.親指と他の指との距離を測る
4.距離がある程度近い場合はドラッグ開始
5.ドラッグ中に距離が離れたら、ドラッグ終了
それぞれの詳細は以下の通りです。
--- < 1.指を認識する > ---
指の認識は、前回の処理とほぼ同様です。
今回追加した処理では、左右のカメラで指を一致させるために、指のマッチングを行いました。
左右画像での指のマッチングは単純で、基準の位置座標を各指を元に変えながら、その他の指の距離を測定し、最も近いものを探しているだけです。
マッチングで指先だけでなく、指の付け根も比較対象に加えることで、マッチングの精度が上がりました。さらに指認識の精度も上がります。
--- < 2.親指を探す > ---
親指には緑のキャップがあるはずなので、各指先でその緑を探します。
そして、最も緑の領域が多い指を親指であるとします。
また、親指のマッチングも行います。
--- < 3.親指と他の指との距離を測る > ---
左右の画像で一致した指の座標が取得できたので、前回と同様三角測量で指の3次元座標を計算します。
全ての指の3次元座標が分かったら、親指とその他の指との距離を計算します。そして、距離が最も近い指を探します。
--- < 4.距離がある程度近い場合はドラッグ開始 > ---
近い指までの距離が分かったら、その距離がある値より小さいかどうか調べます。そして、小さいときに「つまんでいる状態」のフラグを立てます。
「つまんでいる状態」で立方体との衝突判定を行い、
衝突していたら、ドラックを開始します。
ドラッグ中は立方体が指に追従して移動します。
--- < 5.ドラッグ中に距離が離れたら、ドラッグ終了 > ---
親指と近傍の指との距離が一定値より離れた場合、
「つまんでいる状態」フラグを下げます。
ドラッグ中に「つまんでいる状態」フラグが下がったら、ドラッグを中止します。これでドロップができます。
最後のドラッグ&ドロップは、前回の色認識ポインティングと同様です。
