2

私は、いくつかのprocessing.coreライブラリクラスとsimpleopenniを使用してXBOXKinectでユーザーの手を追跡するJavaで記述されたソフトウェアに取り組んでいます。

私が理解しようとしているのは、ユーザーの手の動きが突然方向を変えるときを判断する方法です。

私が現在自由に使えるのは、過去30フレーム程度のユーザーの手の位置を記録するPVectorの配列(基本的にはx、y、z座標のベクトル: 3D空間内のポイント)です。

記録された最新のいくつかのポイントを考えると、ほぼリアルタイムで方向の変化の量を表す値を取得する方法が必要だと思います。たぶん、曲線にフィットして、いくつかの導関数を取りますか?

私はリアルタイムの価値のあるソリューションを実装しようとしているので、理想的には、ソリューションはそれほど計算コストが高くないはずです。

あなたが提供できるどんな方向も大いに感謝されます!

4

2 に答える 2

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終了したフレームの速度が得られ、今終了したばかりのフレームの速度が得られます。nn

最後のフレームでの速度の変化nは、これら2つのベクトルの差である必要があります。各座標について:

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)

正か負かに関係なく、各コンポーネントが全体に貢献するようにするという考え方です。したがって、コンポーネントを2乗するか、絶対値をとることによって、コンポーネントを正に「強制」します。

お役に立てば幸いです。

于 2011-07-01T02:07:24.380 に答える
1

最も簡単な方法は、ベクトルの差を計算すること、つまり一方を他方から減算し、その差が急激な方向転換を判断するのに十分な大きさであるかどうかを判断することではないでしょうか。

それは計算上安価です。

編集:そのビットを拡張するために、同じ方向の2つのベクトルのベクトル差はほぼゼロです。反対方向の2つのベクトルには、大きなベクトル差があります。

例えば

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

(私はそれが2Dであることを知っていますが、原則は同じです。)

于 2011-07-01T01:42:56.903 に答える