Kinectを使ったバーチャル試着室で着せ替えシミュレーション(3ページ目)
前ページからのつづきです。
RGBカメラ、距離カメラ、スケルトンのフレームが更新された時に発生するイベント
Skeletonクラス型の変数mySkeletonを宣言しておきます。
フレームごとのスケルトンデータを表すクラスである、SkeletonFrame型のskeletonFrameData変数を宣言し、e.OpenSkeletonFrameメソッドで、新しいフレームのスケルトンの情報を取得します。CopySkeletonDataToメソッドで、フレームのスケルトンデータを取得します。現在のSkeletonFrameDataにあるスケルトンのフレームデータを、認識可能なプレイヤーの数分の配列を持ったSkeletonクラス型のメンバ配列変数allSkeletonsにコピーします。
CopySkeletonDataToメソッドは、各スケルトンがスケルトンの関節のコレクションを含んでいるスケルトンの配列に、スケルトンデータをコピーするメソッドです。CopySkeletonDataToメソッドで取得されるデータは、プレイヤー分取得されるため、それぞれのトラッキング状態を確認します。
Skeleton型の変数trackedSkeletonで、スケルトンデータを持つallSkeletons配列変数内で、全ての関節の位置がトラッキングされた状態にある、シーケンスの最初の要素を取得していきます。
次に、選択された紳士服の画像が表示されるfashionImageとトラッキング状態にある、HipCenterのジョイントの情報を引数にScalePositionプロシージャを実行します。身体の関節位置の名称については、図4を参照してください。
Private Sub kinect_AllFramesReady(ByVal sender As Object, ByVal e As AllFramesReadyEventArgs)
Dim mySkeleton As Skeleton
Using skeletonFrameData As SkeletonFrame = e.OpenSkeletonFrame()
If skeletonFrameData Is Nothing Then
Return
End If
skeletonFrameData.CopySkeletonDataTo(allSkeletons)
mySkeleton = (From trackedSkeleton In allSkeletons Where trackedSkeleton.TrackingState = SkeletonTrackingState.Tracked Select trackedSkeleton).FirstOrDefault()
End Using
If mySkeleton Is Nothing Then
Return
End If
ScalePosition(fashionImage, mySkeleton.Joints(JointType.HipCenter))
End Sub
紳士服が身体の位置に納まる処理
Coding4Fun Kinect ToolkitのScaleToメソッドで、最大の幅と高さを指定する関節の位置をスケールします。書式は下記です。640×480は表示領域で、0.3Fは単精度浮動小数点型に指定したスケルトンのXとY座標です。
Joint.ScaleTo(width As Integer, height As Integer, MaxSkeletonX As Single, MaxSkeletonY As Single)
Canvas.SetLeftとSetTopプロパティの書式は下記です。
- Canvas.SetLeft(プロパティ値の書き込み対象の要素,指定した要素のCanvas.Left属性を設定)
- Canvas.SetTop(プロパティ値の書き込み対象の要素,指定した要素のCanvas.Top属性を設定)
減算している数値はプレイヤーと紳士服の位置合わせの数字です。
Private Sub ScalePosition(ByVal element As FrameworkElement, ByVal joint As Joint)
Dim scaledJoint As Joint = joint.ScaleTo(640, 480, 0.3F, 0.3F)
If ListBox1.SelectedIndex = 3 Then
Canvas.SetLeft(element, (scaledJoint.Position.X) - 50)
Canvas.SetTop(element, (scaledJoint.Position.Y) - 250)
Else
Canvas.SetLeft(element, (scaledJoint.Position.X) - 50)
Canvas.SetTop(element, (scaledJoint.Position.Y) - 235)
End If
End Sub
ウインドウが閉じられる時の処理
Kinectセンサーが動作している場合は、イベントの登録を解除して、Kinectセンサーを停止します。音声認識も停止し、Kinectのリソースを解放します。
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.AllFramesReady, AddressOf kinect_AllFramesReady
kinect.Stop()
engine.RecognizeAsyncStop()
kinect.Dispose()
End If
End If
End Sub
End Class
※Kinect for Windowsのヘルプより抜粋
今回のサンプルは以上で終了です。
- この記事のキーワード