Kinectプログラミングのための環境構築と簡単なサンプル

2012年7月4日(水)
薬師寺 国安

参照の追加

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

Microsoft.Kinect.dllは、C:\Program Files\Microsoft SDKs\Kinect\v1.5\Assemblies内に存在しますので、これを指定します。CodingFun4.Kinect.Wpf.dllはCoding4Fun.Kinect.Toolkitをダウンロードして解凍したフォルダ内に存在していますので、それを指定してください(図5)。

 図5:筆者の環境に存在するCodingFun4.Kinect.Wpf.dllを指定した(クリックで拡大)

ソリューションエクスプローラー内の「全てのファイルを表示」アイコンをクリックすると、「参照設定」の項目が表示されます。「参照設定」を展開して、Microsoft.KinectとCoding4Fun.Kinect.Wpfが追加されているのを確認してください(図6)。

 図6:Microsoft.KinectとCoding4Fun.Kinect.Wpfが追加されているのを確認する(クリックで拡大)

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

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

リスト2 (MainWindow.xaml.vb)

Option Strict On
Imports Coding4Fun.Kinect.Wpf
Imports Microsoft.Kinect
Class MainWindow

一つのKinectセンサーを表すクラスである、KinectSensorクラス用メンバ変数kinectを宣言します。

  Dim kinect As KinectSensor

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

Kinectが接続されているかどうかを確認し、接続されていない場合は警告メッセージを出して処理を抜けます。接続されている場合は、1番目のKinectを利用するよう指定します。PCには複数のKinectを同時に接続(最大で4台)できますので、もし、複数のKinect接続が確認された場合は、1番目のKinectを利用します。

次に、kinect.ColorStream.EnableメソッドでKinectセンサーのRGBカメラの動作を開始します。AddHandlerステートメントで、RGBカメラのフレームが更新されたことを通知するイベントColorFrameReadyに、kinect_ColorFrameReadyイベントハンドラを追加します。StartメソッドでKinectセンサーを開始します。

  Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    Try
      If KinectSensor.KinectSensors.Count = 0 Then
        MessageBox.Show("KINECTが接続されておりません。")
        Exit Sub
      Else
        kinect = KinectSensor.KinectSensors(0)
        kinect.ColorStream.Enable()
        AddHandler kinect.ColorFrameReady, AddressOf kinect_ColorFrameReady
        kinect.Start()
      End If
    Catch ex As Exception
      MessageBox.Show(ex.Message)
      Exit Sub
    End Try
  End Sub

RGBカメラのフレームが更新されたことを通知するイベント

cameraImageという名前を持つImageコントロールのSourceプロパティに、e.OpenColorImageFrameメソッドで新しいフレームのRGBカメラ情報を取得し、Coding4Fun.Kinect.Wpfの拡張メソッドであるToBitmapSourceで、myImageをBitmapSourceに変換して指定します。

これで、Imageコントロール内にカラーの実画像(実写)が表示されます。このメソッドで取得するColorImageFrameは、Usingで括るか、明示的にDisposeする必要があります。

  Private Sub kinect_ColorFrameReady(sender As Object, e As ColorImageFrameReadyEventArgs)
    Using myImage As ColorImageFrame = e.OpenColorImageFrame
      cameraImage.Source =myImage.ToBitmapSource
    End Using
  End Sub

ウィンドウが閉じられる時に発生するイベント

Kinectセンサーが動いている場合は、ColorFrameReadyイベントの登録を解除し、StopメソッドでKinectセンサーの動作を停止し、最後にDisposeメソッドでリソースを解放します。

  Private Sub MainWindow_Closing(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Me.Closing
    If kinect Is Nothing = False Then
      If kinect.IsRunning = True Then
        RemoveHandler kinect.ColorFrameReady, AddressOf kinect_ColorFrameReady
        kinect.Stop()
        kinect.Dispose()
      End If
    End If 
  End Sub
End Class

次に、表示結果は先のサンプルと同じですが、KinectSensorChooserとKinectColorViewerコントロールを使ったサンプルを紹介します。

RGBカメラを使って画像データを表示する(その2)。

このサンプルのプロジェクト名はKINECT_KinectChooserColorFrameという名前で、WPFアプリケーションです。連載は14回にわたってお届けする予定ですが、その全てをWPFアプリケーションで作成します。

サンプル一式は、会員限定特典としてダウンロードできます。記事末尾をご確認ください。

今回のサンプルでは、Kinectforwindowssdkv1.zipを下記のURLよりダウンロードしてください。
→参照:Kinectforwindowssdkv1(RAPID LIBRARY)

初めてこのページに入った際には、表示されている文字の入力を求められる可能性があります。表示されている文字を入力し[Download]ボタンをクリックしてください。

解凍してできる、\KinectforWindowsSDKV1\KinectforWindowsSDKV1\2.Setting Up Dev Environment\SettingUpDevEnvironmentVB\SettingUpDevEnvironment\bin\Release内にある、Microsoft.Samples.Kinect.WpfViewers.dllを参照の追加で追加してください。

するとツールボックス内に、このDLLに含まれるコントロールが追加されます(図7)。

 図7:Microsoft.Samples.Kinect.WpfViewers.dllを参照することで追加されたコントロール(クリックで拡大)

デザイン画面上にKinectColorViwerとKinectSensorChooserコントロールを1個ずつ配置します(図8)。

 図8:各種コントロールを配置した(クリックで拡大)

次に、KinectColorViewerを選択し、プロパティの[その他]パネルにある、Kinectの「データバインドの適用」を選択します。ElementNameにKinectSensorChooser1を指定し、「パス」にKinectを指定します(図9)。

 図9:KinectColorViewerのKinectプロパティから「データバインドの適用」を設定する(クリックで拡大)

書き出されるXAMLはリスト3のようになります。

リスト3 書き出されたXAMLコード(MainWindow.xaml)

(1)KinectColorViewerのKinectプロパティにデータバインドが指定されている。

<Window x:Class="MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     xmlns:my="clr-namespace:Microsoft.Samples.Kinect.WpfViewers;assembly=Microsoft.Samples.Kinect.WpfViewers" 
  Title="RGBカメラのデータを表示する" Height="417" Width="617">
  <Grid>
    <my:KinectColorViewer Width="400" Height="350"  Margin="100,32,95,46" Kinect="{Binding ElementName=KinectSensorChooser1, Path=Kinect}"></my:KinectColorViewer> ■(1)
    <my:KinectSensorChooser x:Name="KinectSensorChooser1" Margin="179,159,0,0" Width="250" Height="207" VerticalAlignment="Top" HorizontalAlignment="Left"></my:KinectSensorChooser>
  </Grid>
</Window>

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

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

リスト4 (MainWindow.xaml.vb)

Option Strict On
Imports Microsoft.Kinect
Class MainWindow

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

kinectSensorChooser1.KinectSensorChangedイベントで、Kinect センサーが接続されているかどうかを確認します。古いセンサーが動作している場合は停止させ、新しいセンサーを取得します。mySensor.ColorStream.Enableメソッドで、KinectセンサーのRGBカメラの動作を開始します。ColorImageFormat.RgbResolution640x480Fps30列挙体で「RGBフォーマットで、解像度は640×480、フレームレートは毎秒30フレーム」と設定し、Kinectセンサーを開始します。例外が発生した場合はエラーを表示して処理を抜けます。

これで、KinectColorViewerコントロール内にRGBデータ(実写)が表示されます。KinectColorViewerコントロールのKinectプロパティにデータバインドを指定しているため、ColorStream.EnableプロパティでRGBカメラの動作を開始して、Kinectを動作させるだけで実写が表示されます。

  Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    AddHandler KinectSensorChooser1.KinectSensorChanged, Sub(kinectSender As Object, kinectArgs As DependencyPropertyChangedEventArgs)
      Dim oldMySensor = DirectCast(kinectArgs.OldValue, KinectSensor)
      If oldMySensor Is Nothing = False Then
        StopKinect(oldMySensor)
      End If
      Dim mySensor = DirectCast(kinectArgs.NewValue, KinectSensor)
      If mySensor Is Nothing = True Then
        Return
      End If
      mySensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30)
        Try
          mySensor.Start()
        Catch ex As Exception
          MessageBox.Show(ex.Message)
          Exit Sub
        End Try
                             End Sub
  End Sub

ウィンドウが閉じられる時に発生するイベント

動作しているKinectセンサー、KinectSensorChooser1.Kinectを引数に、StopKinectプロシージャを実行します。

  Private Sub MainWindow_Closing(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Me.Closing
    StopKinect(KinectSensorChooser1.Kinect)
  End Sub

Kinectセンサーを中止するプロシージャ

Kinectセンサーが動作している場合はKinectセンサーの動作を停止し、リソースを解放します。

  Private Sub StopKinect(sensor As KinectSensor)
    If sensor Is Nothing = False Then
      If sensor.IsRunning = True Then
        sensor.Stop()
        sensor.Dispose()
      End If
    End If
  End Sub
End Class

表示結果は先のサンプルに同じです。では、次に距離カメラを使って画像を表示させてみましょう。

  • KinectのRGBカメラを使って画像データを表示させるサンプル

  • KinectSensorChooserとKinectColorViewerコントロールを使ったサンプル

  • 距離カメラで画像を表示するサンプル

  • 距離カメラで画像を表示するサンプル (その2)

薬師寺国安事務所

薬師寺国安事務所代表。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メルマガ会員のサービス内容を見る

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