0

ここで、Kinect マウス プロジェクトに関して「Evil Closet Monkey」が回答した質問があります。コードを C# から VB.Net に変換しました。コードは次のとおりです。

Private Sub TrackHandMovement(skeleton As Skeleton)
    Dim leftHand As Joint = skeleton.Joints(JointType.HandLeft)
    Dim rightHand As Joint = skeleton.Joints(JointType.HandRight)

    Dim leftShoulder As Joint = skeleton.Joints(JointType.ShoulderLeft)
    Dim rightShoulder As Joint = skeleton.Joints(JointType.ShoulderRight)

    Dim rightHip As Joint = skeleton.Joints(JointType.HipRight)

    ' the right hand joint is being tracked
    If rightHand.TrackingState = JointTrackingState.Tracked Then
        ' the hand is sufficiently in front of the shoulder
        If rightShoulder.Position.Z - rightHand.Position.Z > 0.4 Then
            Dim xScaled As Double = (rightHand.Position.X - leftShoulder.Position.X) / ((rightShoulder.Position.X - leftShoulder.Position.X) * 2) * SystemParameters.PrimaryScreenWidth
            Dim yScaled As Double = (rightHand.Position.Y - rightShoulder.Position.Y) / (rightHip.Position.Y - rightShoulder.Position.Y) * SystemParameters.PrimaryScreenHeight

            ' the hand has moved enough to update screen position (jitter control / smoothing)
            If Math.Abs(rightHand.Position.X - xPrevious) > MoveThreshold OrElse Math.Abs(rightHand.Position.Y - yPrevious) > MoveThreshold Then
                RightHandX = xScaled
                RightHandY = yScaled

                xPrevious = rightHand.Position.X
                yPrevious = rightHand.Position.Y

                ' reset the tracking timer
                trackingTimerCounter = 10
            End If
        End If
    End If
End Sub

私はすでにMicrosoft.Kinectをインポートしました

今、私はこれらのエラーを示しています:

「xPrevious」は宣言されていません。保護レベルにより、アクセスできない場合があります。「MoveThreshold」が宣言されていません。保護レベルにより、アクセスできない場合があります。「yPrevious」は宣言されていません。保護レベルにより、アクセスできない場合があります。「MoveThreshold」が宣言されていません。保護レベルにより、アクセスできない場合があります。「RightHandX」は宣言されていません。保護レベルにより、アクセスできない場合があります。「RightHandY」は宣言されていません。保護レベルにより、アクセスできない場合があります。「xPrevious」は宣言されていません。保護レベルにより、アクセスできない場合があります。「yPrevious」は宣言されていません。保護レベルにより、アクセスできない場合があります。「trackingTimerCounter」は宣言されていません。保護レベルにより、アクセスできない場合があります。

私は彼らが宣言されていないことを知っており、本当に何をすべきかわかりません.誰かが私を助けてくれますか?

無知でごめんなさい

4

1 に答える 1

0

これらはグローバル変数であり、関数の外で定義する必要があります。

xPrevious関数が終了したときに手があった最後の位置です。関数が再度実行されて、しきい値を超えたかどうかを確認するときに、再度参照されます。

yPrevious上記と同じですが、y座標のみです。

MoveThresholdxは、関数が移動したことを認識するために、またはy軸のいずれかで手が移動する必要がある量です。

したがって、関数の外には次のようなものが必要です...

Dim xPrevious As Double
Dim yPrevious As Double
Dim RightHandX As Double
Dim RightHandY As Double
Dim MoveThreshold As Double = 0.04

(VB でコーディングしてからしばらく経っているため、上記の宣言は少しずれている可能性があります)

そうは言っても、私はもうジッター制御をそのように扱っていません。私はそこに私の小さなハックの仕事よりもはるかに良い仕事をする組み込みの機能を使用しています。ジッター制御については、Kinect センサーを初期化するときに次のように宣言する必要があります。

new TransformSmoothParameters
{
    // as the smoothing value is increased responsiveness to the raw data
    // decreases; therefore, increased smoothing leads to increased latency.
    Smoothing = 0.5f,
    // higher value corrects toward the raw data more quickly,
    // a lower value corrects more slowly and appears smoother.
    Correction = 0.5f,
    // number of frames to predict into the future.
    Prediction = 0.5f,
    // determines how aggressively to remove jitter from the raw data.
    JitterRadius = 0.05f,
    // maximum radius (in meters) that filtered positions can deviate from raw data.
    MaxDeviationRadius = 0.04f
};

sensor.SkeletonStream.Enable(this.TransformSmoothParameters)

(上記は C# コードです)

trackingTimerCounter、バックグラウンドで実行されているタイマーです。それがなくなると、ユーザーは 10 秒以上手を動かしていないので、ハンド カーソルは再び動くまで非表示になります。その行を削除するだけです。

上記のポイントにより、投稿された関数は次のように変更されます。

Private Sub TrackHandMovement(skeleton As Skeleton)
    Dim leftHand As Joint = skeleton.Joints(JointType.HandLeft)
    Dim rightHand As Joint = skeleton.Joints(JointType.HandRight)

    Dim leftShoulder As Joint = skeleton.Joints(JointType.ShoulderLeft)
    Dim rightShoulder As Joint = skeleton.Joints(JointType.ShoulderRight)

    Dim rightHip As Joint = skeleton.Joints(JointType.HipRight)

    ' the right hand joint is being tracked
    If rightHand.TrackingState = JointTrackingState.Tracked Then
        ' the hand is sufficiently in front of the shoulder
        If rightShoulder.Position.Z - rightHand.Position.Z > 0.4 Then
            Dim xScaled As Double = (rightHand.Position.X - leftShoulder.Position.X) / ((rightShoulder.Position.X - leftShoulder.Position.X) * 2) * SystemParameters.PrimaryScreenWidth
            Dim yScaled As Double = (rightHand.Position.Y - rightShoulder.Position.Y) / (rightHip.Position.Y - rightShoulder.Position.Y) * SystemParameters.PrimaryScreenHeight

            RightHandX = xScaled
            RightHandY = yScaled
        End If
    End If
End Sub

RightHandXRightHandY画面上のどこにカーソルを置くべきかを教えてくれます。

私は今、これをすべて少し違う方法で行っていますが、上記は依然としてあなたの手の位置を画面上の点に変換するために機能するはずです.

PS無知を決して謝らないでください。それは私たち全員の出発点です。質問をする; それが私たち全員の学び方です。:)

于 2012-11-19T20:37:16.620 に答える