人物特定に使える!?実際の映像で顔を認識する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

  • 実際の映像で顔を認識する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 Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

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