Kinectを使ったモジュール開発
とても久しぶりの更新です。
4月から新社会人になりました。
いきなりの自己紹介ですが・・・
3月まで大学院で、研究でシステム開発をしていました。
内容は、大まかに言うと、Kinectを利用した人物検出モジュールの開発です。
今回の記事では、開発の時によくわからなかったなぁということを書いていきます。
開発環境は
SDK:Kinect for Windows SDK v1.0
デバイス:Kinect for Windows
言語:C++
です。
Kinectを使った開発ではいろいろと苦労しました。
今回の研究の中で、なるほど!と思ったのをメモとして残しておきます。
まず、一つ目。
Kinectが全身の関節情報を取得する基準です。
通常、Kinectは2人までしか全身の関節の座標値を取得しません。
3人目が入ってきた場合、
どうなるかということを、実験しました。
結果はというと・・・
Kinectにより近い位置にいる人物が全身の骨格情報を取得します。
そのため、認識人物がKinectの画角内にいる時間や認識人物のフレームイン順などを基準にしていないことが言えます。
次に、任意の人物を選択するということです。
KinectのC++版には、人物の認識(追跡)IDを保持する変数があります。
この変数に対して何らかの処理をすることで、開発者が指定する任意人物の全身の骨格情報を保持することが可能になります。
私は、Kinectの画角内にフレームインしてきた人物順に全身の骨格情報を取得する処理を行いたかったです。ですが、なかなか上手くいきませんでした。なので、試行錯誤しながら、考えた内容を書いていきます。
まず最初に、Skeleton Data[0~6]に格納されている認識(追跡)IDを0~6の順番に処理をしていけば、フレームインしてきた人物を処理対象にできると考えました。
(Skeleton Data[0~6]に順番に格納され、Skeleton Data[6]に値が入ったら、Skeleton Data[0]の値が上書きされると予想していました。)
しかし、認識(追跡)IDは、Skeleton Data[0~6]の配列に対して0、1、2・・・と順に認識(追跡)IDが格納されるのではなく、5、3、0・・・などと不規則にID番号が格納されます。(この格納方法に基準はありません。)
次に、認識(追跡)IDの値を基にフレームインしてきた人物を選択すればいいと考えました。しかし・・・
認識(追跡)ID番号は、Kinectが起動してからカウントされる何らかの整数値であり、数値はどんどん増えていくことが分かりました。なので、認識(追跡)IDの数値=検出された人数ではありません。
これらのことをまとめると、
認識(追跡)IDの値は、検出人数との関連性はない
Skeleton Data[0~6]の配列への認識(追跡)IDの格納方法に規則性はない
ということです。
フレームインしてきた人物を順番に処理対象にすることは難しいと考えました。
そのため、私が考えた解決策として、認識(追跡)IDの値を昇順に並び替えます。そして、最大値と次に大きい値を任意の人物のIDを保持する変数に値を入れます。
そうすることで、認識(追跡)IDが最大値と次に大きい値の人物を選択することで一つ目に上げた、Kinectにより近い人物を検出対象とする問題も解決できます。
上記の処理を行うことで、フレームインしてきた人物を選択することができます。
今回の記事は、うまく説明できない部分もありましたが、以上です。