Kinectで手の動きとカーソルを連動して操作するサンプル

次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト3のコードを記述します。
ロジックコードを記述する
リスト3 (MainWindow.xaml.vb)
Option Strict On Imports Coding4Fun.Kinect.Wpf Imports System.Windows.Media.Imaging
画像の移動を可能にするMultiTouch.Behaviors.WPF4名前空間をインポートしておきます。
Imports MultiTouch.Behaviors.WPF4
手の動きとカーソルの動きを連動して、カーソルの現在位置で、ホールドやホールドの解除を提供する、CursorClass.KinectCursor名前空間をインポートしておきます。
Imports CursorClass.KinectCursor Imports Microsoft.Kinect Class MainWindow
マルチタッチの機能を提供するクラスである、MultiTouchBehaviorクラス用メンバ変数behaviorを宣言します。
Dim behavior As MultiTouchBehavior
Imageクラスのメンバ変数myImageを宣言します。
Dim myImage As Image Dim no As Integer = 10 Dim newSensor As KinectSensor
定数メンバ変数を宣言し、それぞれの値で初期化しておきます。マウスカーソルがスムーズに動作する以下の値を設定してください。
Const SkeletonMaxX As Single = 0.6F Const SkeletonMaxY As Single =0.4F Const ClickThreshold As Single = 0.33F
XML要素を表すXElementクラス用メンバ変数xmldocを宣言します。
Dim xmldoc As XElement
Imageクラス型のメンバ変数_imageを宣言しておきます。
Dim _image As Image
ウィンドウが読み込まれた時の処理
XElement.LoadメソッドでXML文書ファイル(photo_etc.xml)を読み込みます。
Descendants メソッドで、子孫要素であるすべての 要素のコレクションに対して、各要素を変数 result に格納しながら、以下の処理を行います。
新しいImageのインスタンスmyImageオブジェクトを作成します。
新しいMultiTouchBehaviorのインスタンスbehaviorオブジェクトを作成します。
ImageオブジェクトのWidthとHeightのプロパティを設定し、SourceプロパティにImageフォルダを付加した、要素の値を指定します。
ImageShowAreaという名前を持つCanvasにAddメソッドで画像を追加します。
10枚の画像が同じ位置に重なって表示されます。
画像の上でマウスの左ボタンが押された時(画像の上にマウスカーソルが乗り、左手が上から下に振り下ろされた時)のイベントハンドラを追加します。
増加する変数noの値を画像のZIndexPropertyの値に指定し、選択された画像が前面に表示されるようにします。
Attachメソッドで画像にアタッチします。
KinectSensorChooser1.KinectSensorChangedイベントで、Kinectが接続されているかどうかを確認します。古いセンサーが動作している時は停止させ、新しいセンサーを取得します。
パラメータのスムージング変換を行う、新しいTransformSmoothParameters型のインスタンスmyParamを宣言し、各プロパティの値を設定します。
Smoothingでは、スムージングの量を設定します。値は0から1.0の範囲で、規定値は0.5です。値が大きいほど平滑化されますが、処理時間は増加します。
Correctionでは、平滑化の緩急を付けます。値は0から1.0の範囲で、規定値は0.5です。1.0に近いほど処理時間は早くなります。
Predictionでは、スムーズに動作させるため予測されたフレームの数を設定します。
JitterRadiusでは、ジッタ低減の半径(メートル)を設定します。デフォルトは」0.05(5cm)です。
MaxDeviationRadiusでは、フィルタされた値と生データとの誤差の許容最大値を設定します。単位はメートルで、規定値は0.04(4cm)です。
上記のプロパティを設定したmyParamオブジェクトを、SkeletonStreamのEnableプロパティに指定し、プレイヤーおよびスケルトンの認識を開始します。
ColorStream.EnableメソッドでRGBカメラの機能を有効にします。
ColorImageFormat.RgbResolution640x480Fps30列挙体で「RGBフォーマットで、解像度は640×480、フレームレートは毎秒30フレーム」と設定します。
RGBカメラ、距離カメラ、スケルトンのフレーム更新を同時に行うイベントAllFramesReadyにイベントハンドラを指定します。
RGBカメラを有効にしてカメラの画像を表示するSensorColorFrameReady、スケルトンのフレーム更新を行い手の動きでマウスカーソルを操作する、SensorSkeletonReadyプロシージャを実行します。
Kinectセンサーを開始します。例外が発生した場合はエラーを表示して処理を抜けます。
Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded xmldoc = XElement.Load("photo_etc.xml") For Each result In From c In xmldoc.Descendants("画像名") Select c myImage = New Image behavior = New MultiTouchBehavior With myImage .Width = 320 .Height = 240 .Source = New BitmapImage(New Uri("Image/" & result.Value, UriKind.Relative)) End With ImageShowArea.Children.Add(myImage) AddHandler myImage.MouseLeftButtonDown, Sub(mouseSender As Object, mouseArgs As MouseButtonEventArgs) _image = DirectCast(mouseArgs.Source, Image) no = no + 1 _image.SetValue(Canvas.ZIndexProperty, no) End Sub behavior.Attach(myImage) Next AddHandler KinectSensorChooser1.KinectSensorChanged, Sub(kinectSender As Object, kinectArgs As DependencyPropertyChangedEventArgs) Dim oldSensor As KinectSensor = DirectCast(kinectArgs.OldValue, KinectSensor) StopKinect(oldSensor) newSensor = DirectCast(kinectArgs.NewValue, KinectSensor) If newSensor Is Nothing = True Then Return End If Dim myParam As New TransformSmoothParameters With myParam .Smoothing = 0.7F .Correction = 0.3F .Prediction = 0.4F .JitterRadius = 1.0F .MaxDeviationRadius = 0.5F End With With newSensor .SkeletonStream.Enable(myParam) .ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30) End With AddHandler newSensor.AllFramesReady, Sub(frameSender As Object, frameArgs As AllFramesReadyEventArgs) SensorSkeletonReady(frameArgs) SensorColorFrameReady(frameArgs) End Sub Try newSensor.Start() Catch ex As Exception MessageBox.Show(ex.Message) Exit Sub End Try End Sub End Sub
-
Kinectで手の動きに合わせてカーソルを動かすサンプル
Think IT会員募集中(登録無料)
会員限定特典の一例
- 記事の内容を補足する解説動画
- 解説内で使用した全ソースコード
- 連載記事をまとめた電子書籍(通常は有償販売)
- 記事や関連する製品・サービスのメルマガ
連載バックナンバー
Think IT会員サービス無料登録受付中
全文検索エンジンによるおすすめ記事
- Kinectで手の動きに合わせてモニタ上の画像を動かすサンプル
- Kinectで人体を認識して棒人間を動かすサンプル
- Kinectを使って、顔の動きを認識して画面に表示する
- センサーの範囲内にいる人間を見つけて撮影・保存するKinectサンプル
- Kinectを使って、自分の手のひらに小さな分身を出現させてみる
- 声で選んだアイテムをプレイヤーの身体に装着・連動させるKinectサンプル
- Kinectを使ったバーチャル試着室で着せ替えシミュレーション
- Kinectで手の動きに合わせて波紋を発生させるサンプル
- 手を動かして画面上の写真を左右にスライドさせるKinectサンプル
- 人物特定に使える!?実際の映像で顔を認識するKinectプログラム