PR

Kinect v2のIRセンサーから赤外線画像を読み込む

2014年9月24日(水)
薬師寺 国安

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

次は、ウインドウが読み込まれた際の処理を記述します。

リスト3 ウインドウが読み込まれた際の処理(MainWindow.xaml.vbの一部、リスト2の続き)

    Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
        myKinectSensor = KinectSensor.GetDefault   (1)
        myInfraredDescription = myKinectSensor.InfraredFrameSource.FrameDescription   (2)

        myInfraredFrameReader = myKinectSensor.InfraredFrameSource.OpenReader   (3)
        myInfraredBitmap = New WriteableBitmap(myInfraredDescription.Width, myInfraredDescription.Height, 96.0, 96.0, PixelFormats.Gray16, Nothing)   (4)
        AddHandler myInfraredFrameReader.FrameArrived, AddressOf myInfraredFrameReader_FrameArrived   (5)
        myKinectSensor.Open()
    End Sub
  1. まずKinectセンサーを使用可能にします。
  2. myKinectSensor.InfraredFrameSource.FrameDescriptionで、赤外線フレームソースの赤外線フレームのプロパティを取得して、メンバー変数myInfraredDescriptionで参照します。
  3. InfraredFrameSource.OpenReaderメソッドで、赤外線フレームを開きます。
  4. 次に、WriteableBitmapのパラメータで初期化された、新しいインスタンス、myInfraredBitmapオブジェクトを作成します。WriteableBitmapの書式については第2回目を参照してください。今回は、PixelFormatsに「Gray16」を指定しています。「PixelFormats.Gray16」は、ピクセルあたりのビット数が「16」(65536段階)のグレースケールチャネルを表示できるピクセル形式を取得します。
  5. AddHandlerステートメントで、InfraredFrameReaderのFrameArrivedイベントにイベントハンドラを指定します。FrameArrivedイベントは、赤外線フレームが到着した時に発生するイベントです。
  6. OpenメソッドでKinectセンサーを開きます。

赤外線フレームが到着した時に発生するイベント

リスト3の(5)で指定したイベントハンドラの内容を記述します。

リスト4 赤外線フレーム到着時の処理(MainWindow.xaml.vbの一部、リスト3の続き)

    Private Sub myInfraredFrameReader_FrameArrived(sender As Object, e As InfraredFrameArrivedEventArgs)
        Using myInfraredFrame As InfraredFrame = e.FrameReference.AcquireFrame   (1)
            If myInfraredFrame Is Nothing = True Then
                Return
            End If

            Dim myInfraredBuffer As UShort() = New UShort(myInfraredDescription.Width * myInfraredDescription.Height - 1) {}   (2)
            myInfraredFrame.CopyFrameDataToArray(myInfraredBuffer)   (3)
            myInfraredBitmap.WritePixels(New Int32Rect(0, 0, myInfraredBitmap.PixelWidth, myInfraredBitmap.PixelHeight), myInfraredBuffer, myInfraredBitmap.PixelWidth * myBytesPerPixel, 0)   (4)
            Image1.Source = myInfraredBitmap   (5)
        End Using
    End Sub
  1. e.FrameReference.AcquireFrameメソッドで赤外線フレームを取得し、myInfraredFrameで参照します。
  2. UShort型の配列変数myInfraredBufferを宣言します。この配列変数の要素数はWidth(512)とHeight(424)の値を乗じた値となります。Color画像以外のDepth画像と赤外線画像の解像度は、512×424になります。
  3. CopyFrameDataToArrayメソッドで、赤外線フレームデータをUShort型配列にコピーします。書式は下記の通りです。

    CopyFrameDataToArray (frameData)

    frameDataには赤外線フレームデータをコピーする先の配列を指定します。この場合はUShort型の配列変数myInfraredBufferを指定しています。
  4. myInfraredBitmap(WriteableBitmapクラス)のWritePixelsメソッドで、ビットマップの指定した領域内のピクセルを更新します。書式については第2回目を参照してください。
  5. Image1のSourceプロパティにmyInfraredBitmapオブジェクトを指定します。これで赤外線センサーからの画像が表示されます。

ウインドウが閉じられる時の処理

最後は、ウインドウが閉じられる際の処理を記述します。

リスト5 ウインドウを閉じる際の処理(MainWindow.xaml.vbの一部、リスト4の続き)

    Private Sub MainWindow_Closing(sender As Object, e As ComponentModel.CancelEventArgs) Handles Me.Closing
        If myInfraredFrameReader Is Nothing = False Then
            myInfraredFrameReader.Dispose()   (1)
            myInfraredFrameReader = Nothing
        End If
        If myKinectSensor Is Nothing = False Then
            myKinectSensor.Close()   (2)
            myKinectSensor = Nothing
        End If
    End Sub
End Class
  1. myInfraredFrameReaderをDisiposeし、全ての関連付けから解放します。
  2. Kinectセンサーも閉じ、全ての関連付けから解放します。

プログラムを実行すると、図2のように表示されます。

図2: 暗闇の中で取得した赤外線センサーからの画像が表示された(クリックで拡大)

次回からは、ゲームや3Dコンテンツの統合開発エンジンであるUnityからKinect v2を利用する方法をご紹介します。

Think IT会員限定特典
  • Kinect v2で赤外線画像を取り込むサンプル

    『速攻攻略 Kinect v2 プログラミング入門』 第4回のサンプルプログラムです。
薬師寺国安事務所

薬師寺国安事務所代表。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会員サービスの概要とメリットをチェック

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