0

我有一个问题,“Evil Closet Monkey”回答了关于 Kinect 鼠标项目的问题,我将代码从 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坐标。

MoveThreshold是您的手必须在xy轴上移动的量,该功能才能识别它已移动。

因此,在您的功能之外,您应该有类似...

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

RightHandX现在RightHandY告诉你光标应该放在屏幕上的什么位置。

我现在做的这一切略有不同,但上面的方法仍然可以将你的手的位置转换为屏幕上的一个点。

P.S. Never apologize for ignorance, it is where we all started from. Ask questions; it is how we all learn. :)

于 2012-11-19T20:37:16.620 回答