2011-07-01 28 views
2

我正在研究一個用Java編寫的軟件,它使用一些processing.core庫類和simpleopenni來跟蹤XBOX Kinect用戶的手。給定一個3d點的數組量化方向變化

我想弄清楚的是如何確定用戶的手部運動何時突然改變方向。

我現在擁有的是一個PVectors陣列(基本上是x,y和z座標向量:3d空間中的一個點),它記錄了過去30幀左右的用戶手部位置。

我想必須有一種方法來獲得一個值,該值代表最近記錄的最近幾個點的近實時方向變化量。也許適合一個曲線,並採取一些衍生物?

理想情況下,解決方案在計算上不應該太昂貴,因爲我試圖實現一個實時有價值的解決方案。

任何方向,你可以提供將不勝感激!

+0

假設幀時間不變是否準確? –

+0

@Charles Goodwin:不是恆定的,但它們的差異很小,我認爲我們可以假定它們是常數 –

回答

3

讓現在的位置(即0幀以前)是(x0, y0, z0)
讓位置n幀以前是(xn, yn, zn)
2n幀前的位置爲(xm, ym, zm)

然後幀2nn之間的位置變化是(xn-xm, yn-ym, zn-zm)
您可以將這視爲這些n幀期間的平均速度。

而且n與現在之間的位置變化是(x0-xn, y0-yn, z0-zn)
這表示在接下來的幀期間的平均速度。

現在你已經有了n幀的速度,它結束了n幀之前的幀,並且你剛剛結束的幀速度爲n

在過去n幀的變化在速度必須這兩個向量之間的差。對於每個座標:

Ax = (x0-xn) - (xn-xm) = x0 -2xn + xm
Ay = (y0-yn) - (yn-ym) = y0 -2yn + ym
Az = (z0-xn) - (zn-zm) = z0 -2zn + zm

加速度的大小|A| = sqrt((Ax)^2 + (Ay)^2 + (Az)^2)
如果你只關心「大」的變化,喜歡速度超過準確性,您可以脫身A' = (Ax)^2 + (Ay)^2 + (Az)^2
甚至A" = abs(Ax) + abs(Ay) + abs(Az)

這個想法我您希望每個組件都對整體作出貢獻,無論它是正面的還是負面的,所以通過調整它或取其絕對值來「強制」它是正面的。

希望有幫助!

+0

謝謝,我會測試一下! –

+1

這是工作很好,謝謝,並接受。 –

1

難道最簡單的方法是找出矢量差異,即從另一箇中減去一個差異,並確定差異有多大足以判斷方向是否突然改變。

這將是計算上便宜的。

編輯:爲了擴大這一點,2個類似方向的向量具有接近零的向量差異。兩個相反方向的矢量將具有較大的矢量差異。

例如

(4,4) - (3,3) = (1,1) 
(4,0) - (0,4) = (4,-4) 
(4,4) - (-4,-4) = (8,8) 

(我知道這是2D,但原理是一樣的。)

+0

我試圖咀嚼這一點...但是我的「矢量」實際上只代表點在三維空間中看到方向的變化,我不得不至少在三點上進行一些數學運算?對不起,如果我不清楚我對PVectors的描述。我編輯了這個帖子 –