14

Attualmente sto lavorando a un'app per telefoni Android. Vogliamo rilevare le caratteristiche di una faccia. Il programma dovrebbe essere in grado di rilevare le posizioni degli occhi, il naso, la bocca e il bordo del viso.Android - Rilevamento funzionalità viso

La precisione dovrebbe essere buona, ma non deve essere perfetta. Va bene perdere un po 'di precisione per velocizzare le cose. Tutte le facce saranno frontali e conosceremo le posizioni approssimative delle caratteristiche precedenti. Non abbiamo bisogno di rilevamento dal vivo. Le caratteristiche dovrebbero essere estratte dalle immagini salvate. Il tempo di rilevamento dovrebbe essere solo finché non disturba l'esperienza dell'utente. Quindi forse anche 2 o 3 secondi vanno bene.

Con questi presupposti non dovrebbe essere troppo difficile trovare una libreria che ci consenta di raggiungere questo obiettivo. Ma la mia domanda è: qual è l'approccio migliore? Qual è il tuo suggerimento? È la prima volta che sviluppo per Android e non voglio correre nella direzione sbagliata. È una buona idea per noi una biblioteca o è meglio (più veloce/più accurata) implementare un algoritmo esistente da solo?

Ho cercato su Google molto e ho trovato molte cose interessanti. C'è anche un rilevamento del volto nell'API Android. Ma la classe di volti restituita (http://developer.android.com/reference/android/media/FaceDetector.Face.html) contiene solo la posizione degli occhi. Questo è meno per la nostra applicazione. Poi c'è anche OpenCV per Android o JavaCV. Con cosa pensi che sia una buona idea lavorare? Per quale libreria ci sono buone documentazioni, tutorial?

+1

prega hai avuto alcun successo nella vostra ricerca? Sto cercando di fare qualcosa di simile. Per favore mi faccia sapere! –

risposta

8

OpenCV ha a tutorial for this purpose, sfortunatamente è C++ solo per cui è necessario convertirlo in Android.

È anche possibile provare l'API FaceDetection in Android, this is a simple example se si rilevano immagini da immagini disegnabili o sdcard. O il più recente Camera.Face API che funziona con l'immagine della telecamera.

Se si desidera che l'immagine della fotocamera sia dinamica al momento della prima lettura, vedere How to take picture from camera., ma si consiglia di controllare i campioni OpenCV Android ufficiali e utilizzarli.

Aggiornato:

Cappellaio Matto Esempio utilizzare il metodo della fotocamera con SurfaceView. È promettentemente veloce. Dai uno sguardo a Mad Hatter.

Il codice in questione, nel caso in cui il collegamento va giù, è questa:

public class FaceDetectionListener implements Camera.FaceDetectionListener { 
    @Override 
    public final void onFaceDetection(Face[] faces, Camera camera) { 
     if (faces.length > 0) { 
      for (Face face : faces) { 
       if (face != null) { 
        // do something 
       } 
      } 
     } 
    } 
} 
+0

Grazie per la tua rapida risposta. In realtà non ho bisogno di un rilevamento del volto. Le immagini che elaborerò contengono solo facce. La parte più importante è trovare le funzionalità. Dove sono gli occhi, il naso, la bocca e dov'è il bordo del viso (dove inizia lo sfondo, dove iniziano i capelli). Ho solo bisogno di applicare questo alle immagini memorizzate e non in tempo reale sulla fotocamera. Conoscete una buona introduzione a questo? Forse OpenCV o un algoritmo alternativo? – tschoartschi

+1

FaceDetection API rileva la faccia sulla base di Distance bw eyes e tale altra caratteristica. Cerca di esplorare.Se non trovi fortuna, vai su OpenCV – Sameer

+0

L'ho visto nella documentazione. Ma stavo pensando se è davvero più facile estrarre le altre funzionalità se conosco la posizione degli occhi. Android 4 ti dà anche le coordinate per la falena. Quindi stavo cercando qualcosa del genere – tschoartschi

4

Sto lavorando a un progetto simile. Ho fatto alcuni test con l'API FaceDetection e posso dirti che non ti aiuterà se vuoi rilevare occhi, naso, bocca e bordi. Questa API ti consente solo di rilevare gli occhi. È inutile se si desidera implementare il riconoscimento facciale perché sono necessarie più funzionalità rispetto agli occhi durante la parte di rilevamento del viso.

Un commento sulla prima risposta: in realtà è necessario rilevare il volto. La ricerca di funzionalità fa parte del rilevamento del volto e ottenere queste funzionalità è il primo passo in un'app di riconoscimento del volto. Con OpenCV è possibile utilizzare le funzioni tipo Haar per ottenere queste funzioni (occhi, naso, bocca, ecc.).

Tuttavia ho trovato un po 'complicato utilizzare le funzioni openCV con un file .cpp separato. C'è una cosa chiamata JNIEXPORT che ti permette di modificare un'immagine della galleria Android con le funzioni OpenCV all'interno di un file .cpp. OpenCV ha una caratteristica di tipo Haar simile a rilevare il file .cpp che può essere utilizzato per il rilevamento del volto (e il riconoscimento come un secondo passo con un altro algoritmo).

Stai sviluppando su Windows o Linux? Sto usando Windows e non sono riuscito a usare il tutorial che hai collegato per impostare OpenCV con esso. Tuttavia ho un ambiente Windows OpenCV funzionante in Eclipse e ho ottenuto tutti i campioni da OpenCV 2.3.1 funzionante. Forse possiamo aiutarci a vicenda e condividere alcune informazioni/risultati? Per favore mi faccia sapere.

+0

Per l'API FaceDetection, sembra rilevare solo il centro degli occhi e la distanza tra di loro, ma è possibile arrivare ai singoli occhi? O è possibile sapere che la faccia è inclinata? –

2

Ho trovato una buona soluzione per il rilevamento del viso emozione fornita da questa API Microsoft. Questa API restituisce una risposta JSON e un grafico delle emozioni. Puoi provare questa API per un buon risultato.

Emozione API

Emotion Recognition riconosce le emozioni espresse da una o più persone in un'immagine, così come ritorna un riquadro per il viso . Le emozioni rilevate sono felicità, tristezza, sorpresa, rabbia, paura, disprezzo e disgusto o neutralità.

  • I formati di immagine di input supportati includono JPEG, PNG, GIF (il primo fotogramma), BMP. Le dimensioni del file immagine non devono essere maggiori di 4 MB.
  • Se un utente ha già chiamato l'API Face, può inviare i rettangoli del viso come input facoltativo. In caso contrario, l'API Emotion per prima cosa comporterà il numero .
  • La gamma di dimensioni della superficie rilevabile è compresa tra 36x36 e 4096x4096 pixel. I volti fuori da questo intervallo non verranno rilevati.
  • Per ogni immagine, il numero massimo di volti rilevati è 64 e le facce sono ordinate in base alla dimensione del rettangolo del viso in ordine decrescente. Se non viene rilevato alcun fronte , verrà restituito un array vuoto.
  • Alcuni volti potrebbero non essere rilevati a causa di problemi tecnici, ad es. angoli facciali molto grandi (testa-posa), grande occlusione. Frontale e volti frontali hanno i migliori risultati. -Il disprezzo delle emozioni e il disgusto sono sperimentali.

https://www.microsoft.com/cognitive-services/en-us/emotion-api

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/12160409) –

+1

Grazie @LucaDetomi –