Kinect開発備忘録(2)
- 2014年7月31日
- Kinect
巷ではWindows9の発表で盛り上がっております。
来年4月にリリースされる予定ですが、入ってくる情報がどれもスゴイもので今から楽しみです。
例えば、OSの統合。現在WindowsのOSは、通常のWindowsの他、タブレット、スマートフォンに分かれています。これがWindows9では全て統合して1つのOSになるそうです。本当に情報通りだと画期的な事だと思います。
それと、今飛び込んだニュースですと、Windows9へのアップデートもスゴイです。Windows8.1を使っているユーザーの他、かなり多いであろうWindows7SP1のユーザーに対し、無料(!)で提供される可能性があるとの事です。
Report: Windows Threshold May Be Coming Free To All Windows 7 Service Pack 1 Users
なんという太っ腹!。Windows9に対しはMicroSoftはかなり強力な攻めの姿勢を見せていますね。
Windows9の続報が入り次第、本ブログでも逐次紹介していきたいと思います。
さて、今回の内容ですが、前回に引き続きKinect開発についての情報を公開していきます。
(尚、言語は今後も基本的にC#で説明していきます)
Kinectの開発で大変な部分があり、それは撮影しているユーザーの動きを検出する事です。
センサー自体は大抵の動きをトレース出来るので、理論的にはユーザーのどんな動きにもアプリ上で対応出来ます。……出来るのですが、それを計算するのがすごく大変です。
その大変なユーザーの姿勢や、腕の動きの検出をライブラリに頼り、作業の負担を減らしたくなるものです。
実は、そのライブラリというのが既に存在しており、Kinect Toolboxというのがその名称です。
サイトからプロジェクトをダウンロードし、作成中のプロジェクトに組み込めばすぐに使用可能です。
(サイトにはSDK1.7での開発で使用出来ると記載されていますが、私が確認した限りSDK1.8でも動きました。まぁ、全ての機能について検証したワケではありませんが……)
このKinect Toolboxでの白眉はなんといっても、前述の姿勢の検出、腕の動きの検出でしょう。
これを使えば、以前グランフロント大阪で設置されていたKinectの着せ替えアプリで行っていた、腕の動きに合わせて服を選択するという機能も簡単に実装出来ます。
Kinect Toolboxですが、姿勢については以下の種類が検出可能です。
- 左手を頭の上にあげる
- 右手を頭の上にあげる
- 左手を肩の上ぐらいまで上げる
- 右手を肩の上ぐらいまで上げる
- 両手を合わせる
腕の動きについては以下の種類が検出可能です。
- 腕を左から右に移動させる
- 腕を右から左に移動させる
これだけでも作業の負担がぐっと減るのですが、左右の腕の検出が出来るならば、上下の腕の動きを検出したくなるというもの。
これについては用意されてはいないのですが、Kinect Toolboxのソースを変更すれば可能です。
変更するファイルですが、SwipeGestureDetector.csで[KinectToolbox] – [Gestures]フォルダ直下に存在します。
上下の動きを追加する場所はLookForGestureメソッド内です。
とりあえず上下の腕の動きを検出するコードを載せておきます。
protected override void LookForGesture()
{
……既存のコードが記載されています。……
// 下から上への動き検出
if (ScanPositions((p1, p2) => Math.Abs(p2.X – p1.X) < SwipeMaximalHeight, (p1, p2) => p2.Y – p1.Y > -0.01f, (p1, p2) => Math.Abs (p2.Y – p1.Y) > 0.2f, SwipeMininalDuration, SwipeMaximalDuration))
{
RaiseGestureDetected(“SwipeToUp”);
return;
}
// 上から下への動き検出
if (ScanPositions((p1, p2) => Math.Abs(p2.X – p1.X) < SwipeMaximalHeight, (p1, p2) => p2.Y – p1.Y < 0.01f, (p1, p2) => Math.Abs(p2.Y – p1.Y) > 0.2f, SwipeMininalDuration, SwipeMaximalDuration))
{
RaiseGestureDetected(“SwipeToDown”);
return;
}
}
多少の調整は必要かと思いますが、コレでいけました。
左右の腕の動きと同じで、SwipeGestureDetector#OnGestureDetectedのコールバックにRaiseGestureDetectedで登録した文字列がStringで渡されるので、後はアプリ上での処理を定義するだけです。
ちなみに第4、第5引数の SwipeMininalDuration、SwipeMaximalDurationは腕の動きを検出する時間(第4引数~第5引数の間のミリ秒)を指定します。なので、この値を変更する事により、ゆっくりした腕の動きや早いの腕の動きなんかも検出が可能になります。
こういうライブラリの存在は開発者にとっては非常にありがたいですね。
さて、これまでSDK1.8を前提で話を進めてきましたが、プレビュー版といえ新型センサーKinect for Windows v2に対応したSDK2.0も出ていますので、今後はそちらをメインを備忘録を書き綴っていければと思っています。
木曜日担当 Window開発チーム 古村
komu at 2014年07月31日 10:00:56