Kinectで距離カメラの値を取得して、指定した距離で人物が背景に溶け込むサンプル
※前ページからの続きです。
ウィンドウが読み込まれた時の処理
Kinect センサーが接続されていない場合は、警告を発して処理を抜けます。そうでない場合は、Kinect センサーを取得します。
DepthStream.Enableメソッドで距離カメラの表示サイズを640×480、1秒あたり30フレームで、動作を開始します。
同様にColorStream.Enableメソッドで、RDBカメラを、RGBフォーマット、表示サイズ640×480、1秒あたり30フレームで、動作を開始します。プレイヤーおよびスケルトンの認識も開始します。
Dim myDepthStream As DepthImageStream = kinect.DepthStreamで、距離カメラの処理を行うクラスのインスタンスを取得します。
Dim myColorStream As ColorImageStream = kinect.ColorStreamで、RGBカメラの処理を行うクラスのインスタンスを取得します。
Short配列変数myDepthPixelDataに、距離カメラのピクセルデータのバイト長分の配列を作成します。
640×480の表示サイズの場合は、myDepthPixelData=New Short(307200-1){}分の配列を確保することになります。-1しているのは配列のインデックスは0から始まるためです。
バイト配列変数myColorPixelDataに、RGBカメラのピクセルデータのバイト長分の配列を作成します。
WriteableBitmapクラス型のPersonを下記の書式で初期化します。
New WriteableBitmap(距離カメラのフレーム幅,距離カメラのフレーム高さ, ビットマップの水平値, ビットマップの垂直値,ビットマップのピクセルフォーマット,ビットマップのビットマップパレット)
ビットマップのピクセルフォーマットに指定する、PixelFormats.Bgra32は、Bgra32 ピクセル形式を取得します。Bgra32 は、bits per pixel (BPP) が 32 の sRGB 形式です。
各カラー チャネル (青、緑、赤、およびアルファ) に割り当てられるbits per pixel (BPP) は 8 になります。これで、Personオブジェクトの表示形式が設定されます。
Person = New WriteableBitmap(640, 480, 96, 96, PixelFormats.Bgra32, Nothing)
と指定しても同じです。
IntRect32構造体のmyImageRectを下記の書式で初期化し、領域を指定します。
New IntRect32(新しいInt32Rect のインスタンスの X座標,新しいInt32Rect のインスタンスの Y座標, 四角形の幅を指定した新しい Int32Rect のインスタンスの幅, 四角形の高さを指定した新しい Int32Rect のインスタンスの高さ)
新しいInt32Rect のインスタンスの X座標と、新しいInt32Rect のインスタンスの Y座標には0を指定します。四角形の幅を指定した新しい Int32Rect のインスタンスの幅には、Personオブジェクトの幅を指定し、Int32Rect のインスタンスの高さには、Personオブジェクトの高さを指定します。結局は、以下のように指定しても同じことです。
myImageRect = New Int32Rect(0, 0, 640, 480)
Kinectを動作させます。
構成ツリーのオブジェクトがレンダリングされる直前に発生する、CompositionTarget.Renderingイベントにイベントハンドラを指定します。イベントハンドラ内では以下の処理を行います。
OpenNextFrame(100)メソッドで、KinectからRGBデータの次のフレームを開きます。
次のフレームがなかった場合のタイムアウトを100ミリセコンドと指定しています。
同様に、次のフレームの距離カメラのストリームを開きます。次のフレームがなかった場合のタイムアウトを100ミリセコンドと指定しています。
背景をマスクし距離データを取得するAppearPlayerプロシージャを実行します。
引数として、RGBと距離カメラで取得した次のフレーム(colorFrameとdepthFrame)を渡しています。
DataContextプロパティにMainWindow自身のインスタンスを渡します。この処理を行わないとプレイヤーが表示されませんので注意してください。
Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded If KinectSensor.KinectSensors.Count = 0 Then MessageBox.Show("KINECTが接続されておりません。") Exit Sub Else kinect = KinectSensor.KinectSensors(0) kinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30) kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30) kinect.SkeletonStream.Enable() Dim myDepthStream As DepthImageStream = kinect.DepthStream Dim myColorStream As ColorImageStream = kinect.ColorStream myDepthPixelData = New Short(myDepthStream.FramePixelDataLength - 1) {} myColorPixelData = New Byte(myColorStream.FramePixelDataLength - 1) {} Person = New WriteableBitmap(myDepthStream.FrameWidth, myDepthStream.FrameHeight, 96, 96, PixelFormats.Bgra32, Nothing) myImageRect = New Int32Rect(0, 0, CInt(Math.Ceiling(Person.Width)), CInt(Math.Ceiling(Person.Height))) kinect.Start() AddHandler CompositionTarget.Rendering, Sub(renderSender As Object, renderArgs As EventArgs) Using colorFrame As ColorImageFrame = kinect.ColorStream.OpenNextFrame(100) Using depthFrame As DepthImageFrame = kinect.DepthStream.OpenNextFrame(100) AppearPlayer(colorFrame, depthFrame) End Using End Using End Sub DataContext = Me 'この記述がないと人物が表示されない End If End Sub
Kinectで距離カメラの値を取得して、距離に応じて姿を隠すサンプル
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Kinectで結成したマイ・ダンスチームを、サンプルを見ながら実際の背景に合成してみよう
- Kinectを使って、画面上の赤い輪をくぐるサンプル
- Kinectの音声認識を使って、プレイヤーを分離、結合させるデモを試してみる
- Kinectを使って、自分の手のひらに小さな分身を出現させてみる
- これであなたもダンスグループの一員!?Kinectで自分を分身させるプログラムを作る
- 人体の連続した動作を音声でキャプチャするKinectのサンプルプログラム
- プレイヤーの身体パーツを判別するKinectサンプル
- 人物を切り抜いて画面に表示するKinectサンプル
- 人物特定に使える!?実際の映像で顔を認識するKinectプログラム
- Kinect v2のカメラから画像を取り込んで表示する基本プログラム