ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

Kinect SDK v1.5の顔追跡機能を使ってみる


Kinect for Windows SDK v1.5の追加機能の一つとして顔の追跡があります。
実際には別パッケージの Kinect for Windows Developer Toolkit に入っているので「SDKを利用した便利なライブラリ」の位置づけになるでしょう*1


言葉として「顔検出」「顔認識」などありますが、ライブラリ周りが「FaceTracker」となっているので、ここでは「顔追跡」と表現することにします。必要に応じて表現が変わる場合もあります。

まずは顔追跡のライブラリをどうやって使うか、ということろを見てみましょう。

プロジェクトを作成する

まずはプロジェクトを作成します。例によってC#+WPFです。

必要なライブラリを追加する

顔追跡に必要なライブラリは次の3つです。Developer Toolkitのサンプルフォルダ(通常は C:\Program Files\Microsoft SDKs\Kinect\Developer Toolkit v1.5.1\Samples\bin )にあります。

  • Microsoft.Kinect.Toolkit.FaceTracking.dll
  • FaceTrackLib.dll
  • FaceTrackData.dll
  1. 「参照設定」からFaceTracking.dllを追加します。
  2. プロジェクトにFaceTrackLib.dllおよびFaceTrackData.dllを追加します。この2つはネイティブのdllのためか、参照設定から追加できないので、プロジェクトに追加します。
  3. FaceTrackLib.dllおよびFaceTrackData.dllのプロパティで「出力ディレクトリにコピー」を「新しい場合はコピーする」に変更します。これによって、実行ファイルと同じフォルダにdllがコピーされます。 

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()は次のデータを必要とします(いくつか種類がありますが、とりあえず一つ)

  • RGBカメラのフォーマット
  • RGBカメラのデータ
  • 距離カメラのフォーマット
  • 距離カメラのデータ
  • 検出させるスケルト

これらを入力すると、結果のFaceTrackFrameが返されます。FaceTrackFrame.TrackSuccessfulというプロパティがあり、これが検出結果を表します。FaceTrackFrame.TrackSuccessfulがtrueの場合に検出データが入っていますので、必要な処理をします。
今回はFaceTrackFrame.FaceRectを使って、顔の位置を囲ってみました。


ちなみにStopwatchクラスでFaceTracker.Track()の時間を計ってみたのですが、概ね30ms前後ととても高速のようです。

*1:サンプルに同梱されているスワイプ・ジェスチャー・ライブラリも同様