Kinect for Windows SDK v1.5の追加機能の一つとして顔の追跡があります。
実際には別パッケージの Kinect for Windows Developer Toolkit に入っているので「SDKを利用した便利なライブラリ」の位置づけになるでしょう*1。
言葉として「顔検出」「顔認識」などありますが、ライブラリ周りが「FaceTracker」となっているので、ここでは「顔追跡」と表現することにします。必要に応じて表現が変わる場合もあります。
まずは顔追跡のライブラリをどうやって使うか、ということろを見てみましょう。
必要なライブラリを追加する
顔追跡に必要なライブラリは次の3つです。Developer Toolkitのサンプルフォルダ(通常は C:\Program Files\Microsoft SDKs\Kinect\Developer Toolkit v1.5.1\Samples\bin )にあります。
FaceTrackerクラスについて
顔追跡させるためのFaceTrackerクラスは Microsoft.Kinect.Toolkit.FaceTracking 名前空間に定義されています。
FaceTracker.Track()で顔を検出します。検出された顔の情報はFaceTrackFrameクラスに格納されて返されます。
FaceTrackFrameクラスに、サンプルのような3Dデータもあるのですが、まずは顔の場所を表示してみましょう。
コード
全体のコードはこちら。動作結果としては前回の顔の角度と同じようになりますが、顔を検出しているので矩形の大きさが立ち位置によって変わります。
/// <summary> /// 顔を追跡する /// </summary> /// <param name="colorFrame"></param> /// <param name="depthFrame"></param> /// <param name="skeleton"></param> private void FaceTracking( ColorImageFrame colorFrame, DepthImageFrame depthFrame, Skeleton skeleton ) { var faceFrame = faceTracker.Track( colorFrame.Format, colorFrame.ToPixelData(), depthFrame.Format, depthFrame.ToPixelData(), skeleton ); if ( faceFrame.TrackSuccessful ) { // 四角を移動させる rectFace.Margin = new Thickness( faceFrame.FaceRect.Left, faceFrame.FaceRect.Top, 0, 0 ); rectFace.Width = faceFrame.FaceRect.Width; rectFace.Height = faceFrame.FaceRect.Height; rectFace.Visibility = System.Windows.Visibility.Visible; } else { rectFace.Visibility = System.Windows.Visibility.Hidden; } }
FaceTracker.Track()は次のデータを必要とします(いくつか種類がありますが、とりあえず一つ)
これらを入力すると、結果のFaceTrackFrameが返されます。FaceTrackFrame.TrackSuccessfulというプロパティがあり、これが検出結果を表します。FaceTrackFrame.TrackSuccessfulがtrueの場合に検出データが入っていますので、必要な処理をします。
今回はFaceTrackFrame.FaceRectを使って、顔の位置を囲ってみました。
ちなみにStopwatchクラスでFaceTracker.Track()の時間を計ってみたのですが、概ね30ms前後ととても高速のようです。
*1:サンプルに同梱されているスワイプ・ジェスチャー・ライブラリも同様