ロジックコードを記述する

次に、ソリューションエクスプローラー内の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

人気記事トップ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