2015-11-05 57 views
2

我已經成功實現了地板夾平面來測量左腳到地面的距離,這是相當準確的。我遇到的問題是,當我離開相機時(即左腳Z軸增加),到地面的腳距改變(增加)。Kinect 2不一致的FloorClipPlane讀數

注意:地板本身沒有傾斜,也沒有Kinect的立場。

我用Kinect 1測試過,結果相同。當我離開或接近相機時,主體的頭部高度(Y軸)也會改變數值。相機傾斜或視線無關緊要。 FloorClipPlane方程中的D值在測試過程中顯示一個常數。

    A = bodyFrame.FloorClipPlane.X; 
        B = bodyFrame.FloorClipPlane.Y; 
        C = bodyFrame.FloorClipPlane.Z; 
        D = bodyFrame.FloorClipPlane.W; 


     distanceLeftFoot = A * leftFootPosX + B * leftFootPosY + C * leftFootPosZ + D; 

爲了讓您知道,我已經在深度和顏色之間進行了座標映射。不知道這是否與這個問題有關。

+0

'code double divisor = Math.Sqrt(leftFootPosX * leftFootPosX + leftFootPosY * leftFootPosY + leftFootPosZ * leftFootPosZ); float test = Convert.ToSingle(divisor); distanceLeftFoot =(A * leftFootPosX + B * leftFootPosY + C * leftFootPosZ + D)/ test;' 我忘了提及這個 – cicsosoft

回答

1

FloorClipPlane以粗體正常形式表示 - 如in the docs所述。具體而言,您的A,B和C值會將攝像機原點(Kinect中心)的單位矢量折算到地平面,以便與地平面產生垂直交點。 D是該矢量的大小(從相機原點到地平面的距離)。

即使您認爲地板平整且Kinect平行於地面,您仍然存在透視翹曲問題,這意味着身體位置(在深度空間測量)隨着您越來越近而變化。

要解決這個問題,你需要提供輸入兩個您的3D座標值和樓層平面,然後它會給你回你想要的東西,從地板面的測量距離聯合:

1

// j is your joint - left foot or any other joint 
float x = j.Position.X; 
float y = j.Position.Y; 
float z = j.Position.Z; 
float distance = (Math.Abs((x * floorPlane.X) + (y * floorPlane.Y) + (z * floorPlane.Z) + floorPlane.W))/((float)Math.Sqrt((Math.Pow(floorPlane.X,2)) + (Math.Pow(floorPlane.Y, 2)) + (Math.Pow(floorPlane.Z, 2)))); 

我希望這可以幫助你。不能進一步詳細說明什麼影響你從深度到顏色的映射可能在這裏做而不看你在做什麼