2012-11-19 108 views
0

我有一個問題在這裏回答了「Evil Closet Monkey」關於Kinect鼠標項目,我將代碼從C#轉換爲VB.Net。代碼如下:VB.Net Kinect鼠標

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'未被聲明。由於其保護級別,它可能無法訪問。

我知道他們沒有申報,真的不知道該怎麼辦,有誰能幫我解決這個問題嗎?

對不起,我的無知

+0

你能鏈接到你從這段代碼得到的文章嗎?我可能會返回並對該代碼進行一些更正。 :) –

回答

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 

RightHandXRightHandY現在告訴你在哪裏光標應該放置在屏幕上。

我現在所做的所有工作都略有不同,但上述功能仍然可以將您的手部位置轉換爲屏幕上的一個點。

P.S. 永遠不要爲無知道歉,這是我們所有人的起點。問問題;這是我們都學習的方式。 :)

+0

非常感謝我的朋友,我很欣賞它,以前我購買了Gesturepak SDK以輕鬆獲取所有內容,並且它的工作方式非常魅力,但是當它出現鼠標移動時,它缺少API文檔,所以我無法獲取它運行多數民衆贊成爲什麼即時通訊尋找它,順便說一句牙醫多數民衆贊成爲什麼我沒有意識到所有的編碼完美,無論如何thaaanks了很多:) –

+0

另一個問題,這個代碼仍然使用(左和右肩)作爲左側和右側屏幕和(頭部和骨盆)作爲屏幕的頂部和底部? –

+0

是的。頭部/臀部=屏幕的頂部/底部。左肩=屏幕左側。屏幕右側是你的右肩,再加上肩膀之間的距離(大約是手臂長度的一半)。 –