HoloLens と Kinect v2 を連携させる -その2-
こんにちは、たるこすです。
前回に引き続き、 HoloLens と Kinect v2 の連携を行います。
前回のブログはこちらです。
HoloLens と kinect v2 を連携させる -その1- - たるこすの日記
今回は Kinect の Body (骨格情報) を実際の自分の体の位置に合わせて HoloLens で表示させます。
キャリブレーションの仕組み
前回のブログの最後にも書きましたが、HoloLens アプリケーションではアプリ実行時の HoloLens の位置が原点、Kinect で取得した関節位置は Kinect がある場所が原点となっています。
そのため、単に Kinect で取得した骨格情報を表示するだけでは、自分のいる位置とずれてしまいます。
HoloLens の座標系と Kinect の座標系を位置をキャリブレーションする方法として、ぱっと思いついたものが以下の3つです。
- HoloLens 上で Kinect のモデルを表示し、それをジェスチャ等で移動させ実際の Kinect との位置を合わせる
- 2D のマーカ画像を用意し、HoloLens と Kinect のそれぞれのカメラでマーカ位置を認識する
- HoloLens の位置と Kinect で取得した頭の位置が同じ位置であるとして、位置を合わせる
今回は実装・実行が簡単そうだと思った3番目の方法「HoloLens の位置と Kinect で取得した頭の位置が同じ位置であるとして、位置を合わせる」で行いました。
HoloLens と Kinect のキャリブレーション
前回紹介した KinectReceiver.cs に Calibrate メソッドを追加します。
この Calibrate メソッドを音声入力で呼べるようにして、両手を横に伸ばしたT字のポーズをとった状態で呼び出します。
KinectReceiver.cs のコード全体は以下のリンクからご覧ください。
KinectReceiver.cs
Calibrate メソッドで行っているのは以下のような処理です。
- HoloLens 座標系での頭の位置を求める(origin2Head)
- 位置は Main Camera の位置にオフセットを加えたもの
- 回転は Main Camera の回転のうち、垂直な軸まわりの回転のみをとったものとする
- Kinect 座標系での頭の位置を求める(kinect2Head)
- 位置は頭のジョイント位置
- 向きは正面を向いているものとして、左ひじ、右ひじの位置から求める
- HoloLens 座標系での Kinect 位置を求める(origin2Kinect)
- origin2Head と kinect2Head の逆行列をかける
HoloLens 座標系での Kinect 位置を求めたら、それを Kinect で取得したジョイント位置を使って表示したオブジェクトの親オブジェクトに反映させます。
これで、HoloLens 座標系でジョイントを表示することができます。
応用例
上の動画で描画されていたオブジェクトを非表示にし、かわりに手の位置に炎を表示してみました。
Acquired fire power with HoloLens and Kinect v2
次はジェスチャ認識をやってみたいと思っています。