やってみよう!Kinectアプリ開発 - 第12回 FaceTracking(前編)

2012-08-17 17:27

zigsow 長谷川 勇
 

はじめに

前回まで3回にわたり、Kinect™ for Windows® SDKを使ったポーズとジェスチャー認識の基本について説明しました。今回からは本連載最後のテーマとして、Kinect for Windows SDK v1.5で追加されたFace Trackingを紹介します。

Face Tracking SDK

Kinect For Windows SDKには Microsoft Face Tracking Software Development Kit for Kinect for Windows (以降 Face Tracking SDK と呼びます)が同梱されており、 アプリケーションから人の顔をリアルタイムに認識することができます。

Face Tracking SDKは、”for Kinect for Windows”という名前の通り、Kinectセンサーと共に利用するよう設計されており、深度情報や骨格情報も利用した高速・高精度の認識が可能ですが、KinectセンサーおよびKinect for Windows SDKが必要になります。

Face Tracking SDKでできること

Face Tracking SDKが提供する顔認識の機能は、以下を始め多岐に渡ります。

  • 画像情報からの顔の検出
  • 顔の追跡
  • 顔の部位各点の座標の取得
  • 顔の向きの取得
  • 表情(口を開いている、眉の上げ下げなど)の取得
  • 顔の3Dモデルの取得

本連載では、これらのうちのいくつかをコードを交えて紹介します。なお、機能の詳細に関してはSDKのドキュメント(http://msdn.microsoft.com/en-us/library/jj130970)もご覧ください。

Face Tracking SDKによる開発

Face Tracking SDKによるアプリケーションの開発は、現状ではC++言語を使った方が、ドキュメントも充実しているため開発しやすいです。しかし、C#言語などの.NETアプリケーションでの開発もできないわけではありません。Face Tracking SDKには、Microsoft.Kinect.Toolkit.FaceTrackingというコンポーネント(以下Kinect Toolkit FaceTrackingと呼びます)が同梱されています。本連載ではKinect Toolkit FaceTracking を使い、C#言語からFace Tracking SDKを使ったアプリケーション開発を紹介します。

なお、Kinect Toolkit FaceTrackingには、C++言語用のAPIをC#言語などの.NETアプリケーションから使えるFtInterop.csと、そのラッパーであるFaceTracker.csがあります。前者を使う場合はC++言語での開発と同等のことが実現でき、またC++用のAPIのドキュメント(http://msdn.microsoft.com/en-us/library/jj130971)が利用できます(ただし、FtInterop.csのインタフェースはinternalとして宣言されているため、これらをpublicに変更するか、FtInterop.csなどをアプリケーションに取り込む必要があります)。後者を使う場合は前者よりも抽象度の高いインタフェースを利用でき、C#言語などとの整合性も高くなりますが、ドキュメントの整備が不十分なため、利用方法を調べるにはFaceTracker.csなどのソースを自分で読む必要があります。

今回はFaceTracker.csを使った開発方法を紹介します。

FaceTracker.csを使ったアプリケーションの処理パターン

FaceTracker.csを使ったアプリケーションの処理パターンは例えば以下のようになります。

  1. KinectのAllFramesReadyEventで、画像(ColorImageFrame)、深度(DepthImageFrame)、骨格(SkeletonFrame)の各フレームを取得
  2. 骨格フレーム中の各骨格情報に対して以下を行う
    1. 新しいプレイヤー(これまでトラッキングしていない新しく出現したプレイヤー)の骨格情報の場合、このプレイヤーに対するFaceTrackerオブジェクトを作成する
    2. FaceTrackerオブジェクトのTrackメソッドに1で取得したフレームを渡し、FaceTrackingの情報を更新する(FaceTrackingの結果を格納するFaceTrackerFrameオブジェクトが返される)
    3. FaceTrackerFrameオブジェクトからアプリケーションが必要な情報(顔の位置や各部位の位置など)を取得する
  3. トラッキングできなくなった骨格情報に対するFaceTrackerオブジェクトを削除する

注意する点として、FaceTrackerオブジェクトを複数のプレイヤーに使いまわさない点があります。FaceTrackerオブジェクトは内部で状態を持っており、直前のフレームで追跡しているプレイヤーを想定してFaceTrackingを行うため、異なるプレイヤーに使いまわすと位置が大きく異なったり、顔の特徴が違うため、うまく追跡できません(実際にはうまく検出できてしまうことも多いですが)。

このため、上記の処理パターンでは、各プレイヤーに対して1つずつFaceTrackerオブジェクトを割り当てています。

Face Tracking SDKを利用したサンプルアプリケーション

実際にサンプルアプリケーションを作成し、Face Tracking SDKの機能を試してみましょう。今回は、Face Tracking SDKの機能の紹介ということで、まずはプレイヤーの顔を認識し、Face Tracking SDKが認識する顔上の各点に赤い点を描画するアプリケーションを作成します。今回も後で直接ソースを掲載しますので、すでに理解されている部分はこれらを適宜ご利用ください。

なお、今回のサンプルアプリケーションでは、FaceTrackingの処理自体にフォーカスするため、前節の説明と異なってしまいますが、アプリケーションで1つだけFaceTrackerオブジェクトを作り、それを使いまわします。このためKinectセンサーの前で複数のプレイヤーが入れ替わる場合には正しく認識されないことがあります。

プロジェクトの作成

まずはアプリケーションのソースファイルなどの入れ物になるプロジェクトを作成します。今回も連載第3回の[プロジェクトの作成]と同様の手順なので解説は不要でしょう。ここでは、プロジェクト名を”FaceTrackingSample”にします。

また、Kinectセンサーの初期化・終了処理のために、Kinect Toolkitも使えるようにしましょう。こちらの手順は連載第8回の[Kinect Toolkitの追加]を行ってください。

Kinect Toolkit FaceTrackingの追加

今回のサンプルアプリケーションでは、Kinect Toolkit FaceTrackingを使いますので、このコンポーネントをアプリケーションに追加します。手順は連載第8回の[Kinect Toolkitの追加]とほぼ同様ですので、ここでは簡単に手順を紹介します。

  1. Developer Toolkit Browser v1.5.0を起動し、[Microsoft.Kinect.Toolkit.FaceTracking]の[Install]をクリックします。
  2. [フォルダーの参照]で、作成中のアプリケーションのプロジェクトの一階層上のフォルダーを選択して、[OK]を押します。
  3. Visual C# で、作成中のアプリケーションを開き、[ソリューションエクスプローラー]から、"ソリューション'FaceTrackingSample'..."を右クリックし、[追加]-[既存のプロジェクト(E)...]を選択します。
  4. [既存プロジェクトの追加]ダイアログで、手順2で追加した"Microsoft.Kinect.Toolkit.FaceTracking"フォルダー直下の"Microsoft.Kinect.Toolkit.FaceTracking.csproj"を選択して[開く(O)]を押します。(ソリューションに"Microsoft.Kinect.Toolkit.FaceTracking"プロジェクトが追加されます)

  5. [ソリューションエクスプローラー]のアプリケーションのプロジェクト("FaceTrackingSample")を右クリックで[参照の追加(R)...]を選択し、[参照の追加]ダイアログで[プロジェクト]タブをクリックし、"Microsoft.Kinect.Toolkit.FaceTracking"を選択、[OK]を押します。([参照設定]に"Microsoft.Kinect.Toolkit.FaceTracking"が追加されます)

 

1件の質問スレッド
  • Kinect for XboxによるFaceTrackingについて カナタ 2012-09-16 17:36 Kinect for Xboxでこのプログラムを実行した時
    XamlParseExceptionはハンドルされませんでした。とエラーが出たのでWin32に変えたところ
    MainWindow.xaml.csの80行目
    kinect.DepthStream.Range = DepthRange.Near;でSystem.InvalidOperationException はハンドルされませんでした。
    The feature is not supported by this version of the hardware
    とのエラーが表示されてしまいました。

    NearをDefaultに変えても、他のところで上のエラーが出てしまいます。

    Kinect for XboxによってFaceTrackingを行うにはどうしたらいいんでしょうか?
    1件のコメント
    • kinection.jp管理人 >カナタさん

      Xbox用のKinectセンサーをWindowsに接続し、Kinect for Windows SDKでFaceTrackingを行う、ということでしょうか。

      こちらでは試せていませんが、FaceTrackingは基本的にはSDK側の機能に近いのでXbox用のKinectセンサーでも動くと思います。

      ただし、Xbox用のKinectセンサーはNearモードに対応していないので、
      kinect.DepthStream.Range = DepthRange.Near;
      skelStream.EnableTrackingInNearRange = true;
      の2行は削除してください。
      (おそらく「他のところで上のエラーが出る」というのは、この2行目ではないでしょうか?)
      2012-09-25 10:40

ジグソープレミアムレビュー

  • やってみようKinect(キネクト)アプリ開発 - ラボクルー集まれ!