人物特定に使える!?実際の映像で顔を認識するKinectプログラム
コントロールの配置(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は Microsoft.Kinect.Toolkit.FaceTracking.dllは、Kinect for Windows Developer Toolkit 1.5.1に含まれる、Face Tracking Basics-WPFをインストールしたディレクトリの、\Face\FaceTrackingBasics-WPF\bin\x86\Debug\フォルダ内に存在していますので、これを指定してください。 ※注意事項:このサンプルを作成して実行する前に、必ず下記のことを行ってださい。これは筆者の環境では発生していますが、ひょっとしたら、皆さんの環境では発生しないかもしれません。 「Kinectを使って、顔の動きを認識して画面に表示する」を参照してください。 次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト1のコードを記述します。 Bgr32形式は1ピクセルあたりのビット数が32bitのRGB形式で、先頭から1バイト(8bit)ずつに青、緑、赤、の情報が入っています。各カラーチャネルに割り当てられるbits per pixel(BBP)が8であるため、Bgr32を8で除算した4バイトの値をメンバ変数BrgPixelに格納しておきます。青、緑、赤では24ビットしか使用されません、残りの8ビットはAlphaに使用されることが多いですが、このサンプルでは使用していません。また32ビットを8で除算した4(バイト)を直接指定しても問題ありません。 KinectSensorChooserクラスの新しいインスタンスsensorChooserメンバ変数を宣言します。KinectSensorChooserクラスはアプリケーションからKinectセンサーを検出するクラスです。 WriteableBitmapクラス型のメンバ変数colorImageWriteableBitmapメンバ変数を宣言します。 バイト配列メンバ変数colorImageDataを宣言します。 RGBカメラの解像度とフレームレートを表す列挙体であるColorImageFormat型のメンバ変数currentColorImageFormatを宣言し、ColorImageFormatを未定義のフォーマットに指定しておきます。 Kinectセンサーを表すメンバ変数Kinectを宣言しておきます。 FaceTrackingViewer1コントロールに、ユーザーコントロールのFaceTrackingViewer.xaml.vb内(前回の2ページ目を参照)で定義したWPFプロパティシステムに登録される依存関係プロパティを表す、DependencyPropertyクラス型のKinectPropertyをバインドします。AddHandlerステートメントでKinectセンサーが検出された時に発生するKinectChangedイベントにイベントハンドラを追加します。KinectSensorChooserを開始します。 新しいKinectセンサーをメンバ変数Kinectに格納します。新しいKinectセンサーが検出された場合は、RGBと距離カメラを有効にします。Nearモードを有効にします。SkeletonTrackingMode.Seatedで、椅子に座った上半身の状態でもスケルトンを認識可能にします。スケルトンを有効にします。AddHandlerステートメントで、RGBカメラ、距離カメラ、スケルトンフレームが更新された時に発生するAllFramesReadyイベントにイベントハンドラを追加します。参照の追加
C:\Program Files\Microsoft SDKs\Kinect\Developer Toolkit v1.5.1\Samples\bin\に存在しますので、これを指定してください。
「C:\Program Files\Microsoft SDKs\Kinect\Developer Toolkit v1.5.1\Redist\x86\フォルダ内のFaceTrackData.dllとFaceTrackLib.dllを、作成したプロジェクトのbin\Debugフォルダ内にコピーする」
この手続きを行っていないと筆者の環境では、コピーできませんとエラーが発生しました。エラーが発生しない場合はこの作業は不要です。ユーザーコントロールのロジックコードを記述する(FaceTrackingViewer.xaml.vb)
ロジックコードを記述する
リスト1 (MainWindow.xaml.vb)
Option Strict On
Imports Microsoft.Kinect
Imports Microsoft.Kinect.Toolkit
Class MainWindow
Dim Bgr32BytesPerPixel As Integer = CInt((PixelFormats.Bgr32.BitsPerPixel) / 8)
Dim sensorChooser As New KinectSensorChooser()
Dim colorImageWritableBitmap As WriteableBitmap
Dim colorImageData As Byte()
Dim currentColorImageFormat As ColorImageFormat = ColorImageFormat.Undefined
Dim Kinect As KinectSensor
ウィンドウが読み込まれた時の処理
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センサーが検出された時の処理
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サンプル
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Kinectを使って、顔の動きを認識して画面に表示する
- Kinectで結成したマイ・ダンスチームを、サンプルを見ながら実際の背景に合成してみよう
- Kinect v2のカメラから画像を取り込んで表示する基本プログラム
- 人物を切り抜いて画面に表示するKinectサンプル
- Kinectの音声認識を使って、プレイヤーを分離、結合させるデモを試してみる
- Kinectを使って、自分の手のひらに小さな分身を出現させてみる
- これであなたもダンスグループの一員!?Kinectで自分を分身させるプログラムを作る
- Kinectを使って、画面上の赤い輪をくぐるサンプル
- プレイヤーの身体パーツを判別するKinectサンプル
- Kinectによる深度データの取得・表示と、モーターを動かすサンプル