Kinectを使ったバーチャル試着室で着せ替えシミュレーション
前ページからのつづきです。
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のヘルプより抜粋
今回のサンプルは以上で終了です。
Kinectを使ったバーチャル試着室を作るサンプル
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 声で選んだアイテムをプレイヤーの身体に装着・連動させるKinectサンプル
- Kinect v2の音声認識で「仮面」を選んで変身してみる
- お花とクラウディアさんを合成して表示するプログラムを作る
- Kinectで手の動きとカーソルを連動して操作するサンプル
- 手を動かして画面上の写真を左右にスライドさせるKinectサンプル
- センサーの範囲内にいる人間を見つけて撮影・保存するKinectサンプル
- Kinectで手の動きに合わせてモニタ上の画像を動かすサンプル
- Kinectで人体を認識して棒人間を動かすサンプル
- 読み込んだ画像に装飾を施し、PictureHUBに保存する
- Kinectを使って、自分の手のひらに小さな分身を出現させてみる