2013-03-20 20 views
9

Attualmente sto lavorando sul riconoscimento dei volti in Android. Ho trascorso un tempo ragionevole su internet e ho trovato la classe FaceDetector.Face in Android. E queste sono le utilità di questa classe:Riconoscimento dei volti con Android sdk non opencv

Constants 
float CONFIDENCE_THRESHOLD 
int EULER_X The x-axis Euler angle of a face. 
int EULER_Y The y-axis Euler angle of a face. 
int EULER_Z The z-axis Euler angle of a face. 

Public Methods 
float confidence() 
float eyesDistance() 
void getMidPoint(PointF point) 
float pose(int euler) 

Il problema è, non so come utilizzare questi metodi e non riesco a trovare alcun codice tutorial o sorgente di esempio per questo. La domanda è: dovrei usare eyesDistance() per differenziare le persone? Per esempio gli occhi di SarahDistanza è = 6,51 cm e John's è = 6,82. Quando il codice calcola una distanza di occhi delle persone e quando è 6,82, è che ti dice che "è John" è questo il modo per identificare le persone? O qual è l'algoritmo per questo? O dovrei usare le costanti EULER? In quale modo? Penso che userò questi metodi per il riconoscimento facciale, ma non so come usarlo.

Oppure puoi suggerire un'altra soluzione per il riconoscimento facciale? Qualsiasi aiuto sarebbe apprezzato.

+2

Il downnotore può lasciare un feedback per favore? In modo che io possa migliorare la domanda. – Ayse

risposta

17

La classe FaceDetector non fa quello che pensi che faccia. Nello specifico, non esegue Riconoscimento facciale, ma invece Rilevamento facciale (da cui il nome classe).

An example of Facial Detection

analizza l'immagine e restituisce Face s trovate nell'immagine. Non fa distinzione tra Face s (non si può sapere se è lo Face di John o lo Face di Sarah) a parte la distanza tra i loro occhi - ma questo non è davvero un valido punto di confronto. Ti dà solo i volti trovati e il livello di confidenza che gli oggetti trovati sono in realtà Face s.

Es:

int maxNumFaces = 2; // Set this to whatever you want 
FaceDetector fd = new FaceDetector(imageWidth,imageHeight,maxNumFaces); 
Faces[] faces = new Faces[maxNumFaces]; 

try { 
    int numFacesFound = fd.findFaces(image, faces); 

    for (int i = 0; i < maxNumFaces; ++i) { 
    Face face = faces[i]; 
    Log.d("Face " + i + " found with " + face.confidence() + " confidence!"); 
    Log.d("Face " + i + " eye distance " + face.eyesDistance()); 
    Log.d("Face " + i + " pose " + face.pose()); 
    Log.d("Face " + i + " midpoint (between eyes) " + face.getMidPoint()); 
    } 
} catch (IllegalArgumentException e) { 
    // From Docs: 
    // if the Bitmap dimensions don't match the dimensions defined at initialization 
    // or the given array is not sized equal to the maxFaces value defined at 
    // initialization 
} 
+0

Grazie per la risposta. Ho pensato che forse c'è una formula in cui usiamo EULER o eyeDistance per identificare una persona. C'è qualche soluzione che mi può suggerire per il problema? – Ayse

+0

@aysealmac Non penso che sia possibile identificare in modo univoco i volti usando solo la posa e la distanza tra gli occhi, ma non sono un esperto nella scienza tra il riconoscimento facciale. – Tushar

+0

Tushar hai una demo di questo? –

7

Come detto Tushar, l'FaceDetector rileva solo le facce. Non puoi riconoscerli usando FaceDetector però. La distanza dell'occhio viene misurata in pixel, non in cm o pollici. Rappresenta quanto è grande il volto all'interno dell'immagine bitmap. Gli angoli di Eulero dovrebbero rappresentare la rotazione 3D della testa. Tuttavia, se la tua app utilizza qualsiasi API prima del 14, i valori degli euler saranno sempre 0.0 (non sono calcolati). Quindi, abbi cura di questo.

Se si desidera eseguire il riconoscimento facciale, è possibile utilizzare opencv. Non l'ho usato da solo, ma penso che sia disponibile su Android. Face Recognition in OpenCV http://docs.opencv.org/trunk/modules/contrib/doc/facerec/

Se non si vuole o non è possibile aggiungere OpenCV al progetto, è possibile programmare il riconoscimento del volto da soli. Ci vuole un po 'di tempo, ma non è così difficile. È possibile implementare alcune varianti di autovetture: http://www.youtube.com/watch?v=LYgBqJorF44&list=PLd3hlSJsX_Imk_BPmB_H3AQjFKZS9XgZm&index=16

Buona fortuna!

+0

Grazie per la risposta – Ayse

1
+0

Benvenuti in Stack Overflow e grazie per la risposta. Per favore [non pubblicare una risposta che consiste essenzialmente in un link] (http://stackoverflow.com/questions/how-to-answer). Includere i punti importanti nella risposta; lascia il link per ulteriori informazioni o come riferimento. –