PR

人物特定に使える!?実際の映像で顔を認識するKinectプログラム

2012年10月5日(金)
薬師寺 国安

コントロールの配置(MainWindow.xaml)

まず、このMainWindow.xamlに先ほど作成しておいたFaceTrackingViewer.xamlを取り込みます。そのためには名前空間を定義する必要があります。要素内にxmlns:local=”と記述すると値の一覧が表示されますので、KINECT_FaceTrackingRGB(KINECT_FaceTrackingRGB) を選択します

ツールボックスからデザイン画面上にImageコントロール1個配置し、次に

この辺りも、前回1ページ目と全く同じ手順ですので、詳細についてはそちらを参照してください。XAMLコードとレイアウトは省略します

参照の追加

VS2010のメニューから「プロジェクト(P)/参照の追加(R)」と選択して、各種コンポーネントを追加しておきます。今回追加するのは、Microsoft.KinectとMicrosoft.Kinect.Toolkit、Microsoft.Kinect.Toolkit.FaceTrackingの3つです。「.NET」タブ内に表示されていないDLLファイルは「参照」タブからDLLファイルを指定します。

Microsoft.Kinect.dllは、C:\Program Files\Microsoft SDKs\Kinect\v1.5\Assemblies内に存在しますので、これを指定します。

Microsoft.Kinect.Toolkit.dllは
C:\Program Files\Microsoft SDKs\Kinect\Developer Toolkit v1.5.1\Samples\bin\に存在しますので、これを指定してください。

Microsoft.Kinect.Toolkit.FaceTracking.dllは、Kinect for Windows Developer Toolkit 1.5.1に含まれる、Face Tracking Basics-WPFをインストールしたディレクトリの、\Face\FaceTrackingBasics-WPF\bin\x86\Debug\フォルダ内に存在していますので、これを指定してください。

※注意事項:このサンプルを作成して実行する前に、必ず下記のことを行ってださい。これは筆者の環境では発生していますが、ひょっとしたら、皆さんの環境では発生しないかもしれません。
「C:\Program Files\Microsoft SDKs\Kinect\Developer Toolkit v1.5.1\Redist\x86\フォルダ内のFaceTrackData.dllとFaceTrackLib.dllを、作成したプロジェクトのbin\Debugフォルダ内にコピーする」
この手続きを行っていないと筆者の環境では、コピーできませんとエラーが発生しました。エラーが発生しない場合はこの作業は不要です。

ユーザーコントロールのロジックコードを記述する(FaceTrackingViewer.xaml.vb)

Kinectを使って、顔の動きを認識して画面に表示する」を参照してください。

次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト1のコードを記述します。

ロジックコードを記述する

リスト1 (MainWindow.xaml.vb)

Option Strict On
Imports Microsoft.Kinect
Imports Microsoft.Kinect.Toolkit

Class MainWindow

Bgr32形式は1ピクセルあたりのビット数が32bitのRGB形式で、先頭から1バイト(8bit)ずつに青、緑、赤、の情報が入っています。各カラーチャネルに割り当てられるbits per pixel(BBP)が8であるため、Bgr32を8で除算した4バイトの値をメンバ変数BrgPixelに格納しておきます。青、緑、赤では24ビットしか使用されません、残りの8ビットはAlphaに使用されることが多いですが、このサンプルでは使用していません。また32ビットを8で除算した4(バイト)を直接指定しても問題ありません。

  Dim Bgr32BytesPerPixel As Integer = CInt((PixelFormats.Bgr32.BitsPerPixel) / 8)

KinectSensorChooserクラスの新しいインスタンスsensorChooserメンバ変数を宣言します。KinectSensorChooserクラスはアプリケーションからKinectセンサーを検出するクラスです。

  Dim sensorChooser As New KinectSensorChooser()

WriteableBitmapクラス型のメンバ変数colorImageWriteableBitmapメンバ変数を宣言します。

  Dim colorImageWritableBitmap As WriteableBitmap

バイト配列メンバ変数colorImageDataを宣言します。

  Dim colorImageData As Byte()

RGBカメラの解像度とフレームレートを表す列挙体であるColorImageFormat型のメンバ変数currentColorImageFormatを宣言し、ColorImageFormatを未定義のフォーマットに指定しておきます。

  Dim currentColorImageFormat As ColorImageFormat = ColorImageFormat.Undefined

Kinectセンサーを表すメンバ変数Kinectを宣言しておきます。

  Dim Kinect As KinectSensor

ウィンドウが読み込まれた時の処理

FaceTrackingViewer1コントロールに、ユーザーコントロールのFaceTrackingViewer.xaml.vb内(前回の2ページ目を参照)で定義したWPFプロパティシステムに登録される依存関係プロパティを表す、DependencyPropertyクラス型のKinectPropertyをバインドします。AddHandlerステートメントでKinectセンサーが検出された時に発生するKinectChangedイベントにイベントハンドラを追加します。KinectSensorChooserを開始します。

  Public Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    Dim faceTrackingViewerBinding = New Binding("Kinect") With {.Source = sensorChooser}
    FaceTrackingViewer1.SetBinding(FaceTrackingViewer.KinectProperty, faceTrackingViewerBinding)
    AddHandler sensorChooser.KinectChanged, AddressOf SensorChooserOnKinectChanged
    sensorChooser.Start()
  End Sub

Kinectセンサーが検出された時の処理

新しいKinectセンサーをメンバ変数Kinectに格納します。新しいKinectセンサーが検出された場合は、RGBと距離カメラを有効にします。Nearモードを有効にします。SkeletonTrackingMode.Seatedで、椅子に座った上半身の状態でもスケルトンを認識可能にします。スケルトンを有効にします。AddHandlerステートメントで、RGBカメラ、距離カメラ、スケルトンフレームが更新された時に発生するAllFramesReadyイベントにイベントハンドラを追加します。

  Private Sub SensorChooserOnKinectChanged(sender As Object, e As KinectChangedEventArgs)
    Kinect = e.NewSensor
      If Kinect Is Nothing = False Then
        Kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30)
        Kinect.DepthStream.Enable(DepthImageFormat.Resolution320x240Fps30)
        Kinect.DepthStream.Range = DepthRange.Near
        Kinect.SkeletonStream.EnableTrackingInNearRange = True
        Kinect.SkeletonStream.TrackingMode = SkeletonTrackingMode.Seated
        Kinect.SkeletonStream.Enable()
        AddHandler Kinect.AllFramesReady, AddressOf KinectSensorOnAllFramesReady
      End If
  End Sub

Think IT会員限定特典
  • 実際の映像で顔を認識するKinectサンプル

薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

Think IT会員サービス無料登録受付中

Think ITでは、より付加価値の高いコンテンツを会員サービスとして提供しています。会員登録を済ませてThink ITのWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

他にもこの記事が読まれています