2013-02-05 69 views
3

我正在嘗試使用Kinect傳感器和SDK來計算用戶頭部的方向,但我無法在Google上找到任何有用的幫助。有人有任何好的示例,教程或類似的東西可以幫助我嗎?Kinect:計算頭部的俯仰,偏航,側傾角度

+0

你看方向,同時捕捉站在球員的全部骨架,或者說是玩家坐在靠近Kinect感應器?您可以通過「FaceTracking」函數來獲取此信息(如果玩家靠近),但頭部方向不是常規骨架數據結構的一部分。 –

+0

我更喜歡站立的球員,但如果這是不可能的,那麼我可以坐在靠近傳感器的位置。我知道我可以使用FaceTracking,但問題是,如果用戶例如把頭轉向太多,FaceTracker將失去它的映射。 – smukov

+0

你需要考慮'FaceTracking'函數的擴展,或者編寫自己的函數(儘管可以使用存在的基類)。 「FaceTracking」代碼仍然可以遵循重要點,即使它沒有足夠的渲染面網格。雖然我還沒有用過這個例子,所以我不確定。不幸的是,SDK的「開箱即用」功能沒有您所尋求的值。 –

回答

2

我認爲輥,我已發現了一個解決方案儘管它是有限的,但它只在Kinect SDK可以檢測到臉部時起作用,因爲我使用的是FaceTrackFrame對象。

如果有人在Kinect SDK無法檢測到臉部時發現追蹤更多極端角度的解決方案,我會更樂意看到它。

我的解決方案看起來是這樣的:

 FaceTrackFrame faceFrame = faceTracker.Track(
      kinectSensor.ColorStream.Format, colorPixelData, 
      kinectSensor.DepthStream.Format, depthPixelData, skeleton); 

     // Only works if face is detected 
     if (faceFrame.TrackSuccessful) 
     { 
      txtTracked.Content = "TRACKED"; 
      txtRoll.Content = faceFrame.Rotation.Z; 
      txtPitch.Content = faceFrame.Rotation.X; 
      txtYaw.Content = faceFrame.Rotation.Y; 
     } 
1

我設法使用圖像中的深度數據手動計算這些值。

首先,你需要得到深度點

private EnumIndexableCollection<FeaturePoint, Vector3DF> depthPoints; 

然後,如果你看一下附帶的SDK的FaceTracking觀衆代碼和搜索DrawFaceModel功能。您可以在1st for循環中像這樣提取代碼。

faceModelPts3D.Add(new Point3D(this.depthPoints[i].X + 0.5f, this.depthPoints[i].Y + 0.5f, this.depthPoints[i].Z + 0.5f)); 
    FaceDataPoints.DepthXPointInfo[i] = this.depthPoints[i].X; 
    FaceDataPoints.DepthYPointInfo[i] = this.depthPoints[i].Y; 
    FaceDataPoints.DepthZPointInfo[i] = this.depthPoints[i].Z; 

然後我把點0和點9放到下面的函數中來獲得Pitch。然後我將點120和116放入以獲得打哈欠角。

public static double FacePitch(double FirstXPos, double FirstYPos, double FirstZPos, double SecXPos, double SecYPos, double SecZPos) 
    { 
     double PitchAngle = 0; 
     double r = 0; 
     double XDifference, YDifference, ZDifference = 0; 
     double DifferenceSquared = 0; 

     XDifference = FirstXPos - SecXPos;//Calculates distance from Points 
     YDifference = FirstYPos - SecYPos; 
     ZDifference = FirstZPos - SecZPos; 

     DifferenceSquared = Math.Pow(XDifference, 2) + Math.Pow(YDifference, 2) + Math.Pow(ZDifference, 2); 

     r = Math.Sqrt(DifferenceSquared); 

     PitchAngle = (Math.Acos(ZDifference/r)); 

     PitchAngle = ((PitchAngle * 180/Math.PI) - 90) * -1; //Converts to Degrees as easier to recognise visually 

     return PitchAngle; 
    } 

對於i放置在再次點0和9,並再次使用上述功能,但我改變

PitchAngle = (Math.Acos(ZDifference/r)); 

RollAngle = Math.Acos(XDifference/r); 
+0

用戶需要關閉這個還是你能夠從遠處計算這些數字? –

+2

只要SDK能檢測到用戶臉部就好像是功能 – difurious

+0

非常好。我期待着嘗試! –

相關問題