2015-09-04 21 views
9

Ho un'applicazione Android che sta ricevendo le coordinate del gesto (3 assi - x, y, z). Ho bisogno di confrontarli con le coordinate che ho nel mio DB e determinare se sono uguali o meno.Confronta valori o struttura del grafico

Ho anche bisogno di aggiungere un po 'di tolleranza, dal momento che l'accelerometro (dispositivo che cattura i gesti) è molto sensibile. Sarebbe facile, ma voglio anche prendere in considerazione per es. "grande cerchio" disegnato nell'aria, identico a "piccolo cerchio" disegnato nell'aria. il che significa che ci sarebbero valori diversi, ma la struttura del grafico sarebbe la stessa, giusto?

Ho sentito parlare della traduzione dei valori dei grafici in bit e quindi del confronto. È l'approccio giusto? Esiste una libreria per tale confronto?

Finora l'ho appena codificato, coprendo tutte le mie esigenze tranne l'ultima (grande cerchio o piccola cerchia).

Il mio codice ora:

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:

ho trovato JGraphT, potrebbe funzionare. Se ne sai già qualcosa, fammi sapere.

EDIT2:

vedere queste immagini, che sono lo stesso gesto, ma uno è fatto in un movimento più lento rispetto ad un altro.

veloce uno: Faster

più lenta: le immagini enter image description here

non ho catturato dello stesso gesto in cui si potrebbe essere più piccolo di un altro, potrebbe aggiungere che più tardi.

+0

è la prestazione o la manutenibilità l'aspetto più importante di quello che stai cercando? – Emz

+0

No, non proprio. Voglio dire che non può essere lento, ma non deve nemmeno essere veloce. –

risposta

2

Se l'elenco dei gesti è complesso, suggerirei di addestrare una rete neurale in grado di classificare i gesti in base ai bit del valore del grafico che hai menzionato. Il compito è molto simile alla classificazione delle cifre numeriche scritte a mano, per cui molte risorse ci sono in rete.

L'altro approccio sarebbe quello di indovinare matematicamente la forma del gesto, ma dubito che sarà utile considerando la tolleranza dell'accelerometro e il fatto che gli utenti non disegnino forme precise.

2

(a) convertire le coordinate 3D in una figura in 2D semplice. Utilizzare matrix transformations.

(b) normalizzare la bilancia gesto - nuovo con trasformazioni di matrice

(c) normalizzare il numero di punti o utilizzare interpolazione nel passaggio successivo.

(d) calcolare la differenza tra la stored (s) gesto e corrente (c) gesto come

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

Se la differenza è inferiore a vostra precisione predefinito - gesti sono uguali.

+0

Grande uomo di roba. Anche per l'interpolazione penso che la spline cubica sia migliore di quella lineare per l'interpolazione. Per favore chiarisci se intendevi diversamente. –