2015-09-04 7 views
9

ジェスチャー座標(3軸-x、y、z)を取得しているアンドロイドアプリケーションがあります。私は私のDBにある座標とそれらを比較し、それらが同じかどうかを判断する必要があります。グラフの値や構造を比較する

加速度計(ジェスチャーをキャプチャするデバイス)は非常に敏感なので、いくつかの許容誤差を追加する必要もあります。それは簡単ですが、私はまた考えてみたいと思います。空気中に描かれた "大きな円"、空中に描かれた "小さな円"と同じ。異なる値が存在することを意味しますが、グラフの構造は同じでしょうか?

グラフの値をビットに変換して比較することについて聞いたことがあります。それは正しいアプローチですか?そのような比較のためのライブラリはありますか?

これまでのところ、最後のもの(大きな円と小さな円)以外のすべての要件をカバーしています。

私のコード今:

private int checkWhetherGestureMatches(byte[] values, String[] refValues) throws IOException { 
     int valuesSize = 32; 
     int ignorePositions = 4; 

     byte[] valuesX = new byte[valuesSize]; 
     byte[] valuesY = new byte[valuesSize]; 
     byte[] valuesZ = new byte[valuesSize]; 

     for (int i = 0; i < valuesSize; i++) { 
      int position = i * 3 + ignorePositions; 
      valuesX[i] = values[position]; 
      valuesY[i] = values[position + 1]; 
      valuesZ[i] = values[position + 2]; 
     } 


     Double[] valuesXprevious = new Double[valuesSize]; 
     Double[] valuesYprevious = new Double[valuesSize]; 
     Double[] valuesZprevious = new Double[valuesSize]; 


     for (int i = 0; i < valuesSize; i++) { 
      int position = i * 3 + ignorePositions; 
      valuesXprevious[i] = Double.parseDouble(refValues[position]); 
      valuesYprevious[i] = Double.parseDouble(refValues[position + 1]); 
      valuesZprevious[i] = Double.parseDouble(refValues[position + 2]); 
     } 


     int incorrectPoints = 0; 
     for (int j = 0; j < valuesSize; j++) { 
      if (valuesX[j] < valuesXprevious[j] + 20 && valuesX[j] > valuesXprevious[j] - 20 
        && valuesY[j] < valuesYprevious[j] + 20 && valuesY[j] > valuesYprevious[j] - 20 
        && valuesZ[j] < valuesZprevious[j] + 20 && valuesZ[j] > valuesZprevious[j] - 20) { 
      } else { 
       incorrectPoints++; 
      } 
     } 
     return incorrectPoints; 
    } 

EDIT:

私はそれがうまくいくかもしれない、JGraphTを発見しました。あなたがすでにそれについて知っているなら、私に知らせてください。

EDIT2:

は、彼らが同じジェスチャーしているが、1つが他より遅い運動で行われ、これらの画像を参照してください。 1

の高速化:1 Faster

遅い: enter image description here

私は1つが他よりも小さいだろうと同じジェスチャーの画像をキャプチャしていませんが、その後に追加される場合があります。

+0

は、パフォーマンスや保守性、あなたが探しているものの中で最も重要な側面ですか? – Emz

+0

いいえ。私はそれが遅くなることはできませんが、それは雷が速い必要はありませんことを意味します。 –

答えて

0

Dynamic Time WrappingアルゴリズムのJava実装を使用しました。ライブラリはfastDTWと呼ばれます。

残念なことに、私が断言したことから、もう使用できませんが、もう使用できません。

私は今、思い出すことはできませんが、私は、私はこの1つを使用し、それを自分でコンパイルしたと思うhttps://code.google.com/p/fastdtw/https://github.com/cscotta/fastdtw/tree/master/src/main/java/com/fastdtw/dtw

2

ジェスチャーのリストが複雑な場合は、言及したグラフ値ビットに基づいてジェスチャーを分類できるニューラルネットワークをトレーニングすることをお勧めします。この作業は手書きの数字の分類に非常によく似ています。手書きの数値はネット上にたくさんのリソースがあります。

ジェスチャの形状を数学的に推測する方法もありますが、加速度計の許容誤差とユーザーが正確な形状を描かないことを考慮すると、それは有用ではないでしょうか。

2

(a)3D座標を2D平面図に変換します。 matrix transformationsを使用してください。

(b)は、自分のジェスチャスケールを正規化 - 再度マトリックス変換

(C)点の数を正規化するか、次のステップで補間を使用して。

(d)の差が事前定義された精度を下回る場合

Sum((Xs[i] - Xc[i])^2 + (Ys[i] - Yc[i])^2) where i = 0 .. num of points 

として保存された(S)ジェスチャーと現在の(c)のジェスチャーの間の差を計算する - ジェスチャーが等しいです。

+0

偉大なスタッフの男。また、補間のために、補間のために3次スプラインが線形より優れていると思います。そうでない場合は、明確にしてください。 –

関連する問題