Kinect重量挙げ #3 姿勢判定の実装

道具

まずは判定の仕方について。姿勢を判定するには複数の要素(スケルトンの各関節情報)を対象と比較しなければなりません。しかし、要素の値を一つ一つ比べて総合的な一致度を測る、というのはいかにも煩雑です。そこでベクトルの内積を使います。

ベクトルの内積(ドット積)とは…くわしくはググってください。高校生は教科書を読もう。端的にいうと、ベクトル同士の向きがどれだけ近いかを求める演算です。ベクトルは何次元でもかまわず、計算も簡単です。

これを利用するとたとえば、5つの数値を1つの5次元ベクトルとして表すことで、同じく5次元ベクトルで表された対象と一発で比較することができます。ただし、両ベクトルの長さは単位長(1.0)にあらかじめ丸めておく(正規化)。すると内積の値は両者が近いほど1.0に近づくことになり(真逆なら-1.0)、容易に判定できるというわけ。

判定

どこを/なにを判定するか。これははっきりいって行き当たりばったり、適当な仮説を立て、実験をくりかえして調整しました。結果的に次のような要素を緩めの閾値で判定しています。

  • 腕・脚の向き
    バンザイ姿勢を例にすると(以下同様)、腕や脚は上向きに伸びているはずなので、これを腕や脚を表すベクトルと上向きベクトルとの内積で判定する。
  • 肘・膝の角度
    肘や膝の角度はほぼまっすぐのはずなので、これを前腕ベクトルと上腕ベクトルとの内積で判定する。
  • 対称性
    両腕両脚はほぼ左右対称なはずなので、これを左側ベクトルと反転させた右側ベクトルとの内積で判定する。

ほかにも補助的な情報をとってたりしますが、こまかいので省きます。

Scarecrow

実験をサポートしてくれた「タケヒトちゃん1号」。Kinectに人として認識される。当社の一部スタッフも人だと思ってた模様