人物特定に使える!?実際の映像で顔を認識するKinectプログラム[3ページ目]

RGBカメラ、距離カメラ、スケルトンフレームが更新された時に発生するイベント

e.OpenColorImageFrameで、新しいフレームのRGBカメラの情報を取得し、e.OpenDepthImageFrameで、新しいフレームの距離カメラの情報を取得します。これらのメソッドで取得するcolorImagerFrameやdepthImageFrameは、Usingで括るか、明示的にDisposeする必要があります。Kinect センサーを取得します。

ブール型の変数haveNewFormat変数を宣言し、未定義に設定されていたRGBカメラのイメージフォーマットが、RGBカメラのイメージフレームのフォーマットと同じでない場合のブール値を取得します。ブール値がTrueの場合は、RGBカメラのイメージフォーマットをRGBカメラのイメージフレームのフォーマットと同じにします。バイト配列変数colorImageDataにRGBカメラのイメージフレームのピクセルデータを取得するためのバイト列(colorImageFrame.PixelDataLength - 1で取得)を確保します。

次に、WriteableBitmapクラス型のcolorImageWritableBitmapを下記の書式で初期化します。

New WriteableBitmap(距離カメラのフレーム幅,距離カメラのフレーム高さ, ビットマップの水平値, ビットマップの垂直値,ビットマップのピクセルフォーマット,ビットマップのビットマップパレット)

「ビットマップのピクセルフォーマット」に指定する、PixelFormats.Bgr32は、Bgr32 ピクセル形式を取得します。Bgr32 ピクセル形式を取得します。Bgr32 は、bits per pixel(BPP)が 32 の sRGB 形式です。各カラー チャネル(青、緑、および赤)に割り当てられる bits per pixel(BPP)は 8 です。

ここは、
colorImageWritableBitmap = New WriteableBitmap(640,480, 96, 96, PixelFormats.Bgr32, Nothing)
と指定しても同じです。colorImageというNameのImageコントロールのSourceプロパティにcolorImageWriteableBitmapオブジェクトを指定します。

colorImageFrame.CopyPixelDataToメソッドを呼び出し、バイト列のcolorImageDataからピクセルデータを取得します。CopyPixelDataToメソッドは、ピクセルデータの長さを使用して、事前に割り当てられた配列へ、ピクセルごとの深度データやRGBデータをコピーします。

Kinectの画像をビットマップデータに書き出します。WriteableBitmap型の変数colorImageWritableBitmapにWritePixelsメソッドで、byteからビットマップへ書き出します。ビットマップの指定した領域内のピクセルを更新します。書式は下記の通りです。

WritePixels(更新するWriteableBitmapの四角形,ビットマップの更新に使用するピクセル配列,pixel内の更新領域のストライド,入力バッファのオフセット)

「更新するWriteableBitmapの四角形」には

New Int32Rect(0, 0, colorImageFrame.Width, colorImageFrame.Height)
と指定します。

「pixel内の更新領域のストライド」には、
colorImageFrame.Width * Bgr32BytesPerPixelは640*4=2560に同じです。
と指定します。これは下記のように記述しても同じです。
colorImageWritableBitmap.WritePixels(New Int32Rect(0, 0, 640, 480), colorImageData, 2560, 0)

この記述で、実写のプレイヤーの顔に、顔の輪郭に沿って三角形の集合体のジオメトリーが表示されます。この記述がないと、背景が真っ黒で三角形のジオメトリーで構成された輪郭だけが表示されます。前回と同じ表示になります。

  Private Sub KinectSensorOnAllFramesReady(sender As Object, e As AllFramesReadyEventArgs)
    Using colorImageFrame =e.OpenColorImageFrame()
      Using depthImageFrame = e.OpenDepthImageFrame
        Dim kinect As KinectSensor = TryCast(sender, KinectSensor)
        If kinect Is Nothing = True Then
          Return
        End If
   
        If colorImageFrame Is Nothing = True Then
          Return
        End If
        Dim haveNewFormat As Boolean = currentColorImageFormat <> colorImageFrame.Format
        If haveNewFormat = True Then
          currentColorImageFormat = colorImageFrame.Format
          colorImageData = New Byte(colorImageFrame.PixelDataLength - 1) {}
          colorImageWritableBitmap = New WriteableBitmap(colorImageFrame.Width, colorImageFrame.Height, 96, 96, PixelFormats.Bgr32, Nothing)
          colorImage.Source = colorImageWritableBitmap
        End If
        colorImageFrame.CopyPixelDataTo(colorImageData)
        colorImageWritableBitmap.WritePixels(New Int32Rect(0, 0, colorImageFrame.Width, colorImageFrame.Height), colorImageData, colorImageFrame.Width * Bgr32BytesPerPixel, 0)
      End Using
    End Using
  End Sub

ウィンドウが閉じられた時の処理

Kinectセンサーの検出を停止します。ユーザーコントロールであるFaceTrackingViewer1のリソースを解放します。

  Private Sub MainWindow_Closing(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Me.Closing
    sensorChooser.Stop()
    FaceTrackingViewer1.Dispose()
  End Sub
End Class

以上で今回のサンプルは終了です。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30