2013-05-06 19 views
7

Sto cercando di trovare i tre angoli del volto di una persona, basato su un'immagine 2D 2D image.Stima della stima della testa con OpenCV, C++ e Image 2D - Metodo geometrico - Rotolo, imbardata e passo

Sto usando OpenCV con HaarCascade per trovare il viso, gli occhi, il naso e la bocca. Ma non ho trovato alcun metodo geometrico che possa aiutarmi a trovare gli angoli X, Y e Z (Roll, Pitch and Yaw).

Qualcuno potrebbe aiutarmi a mostrare un metodo in C++ o java che funzioni?

+0

questo non è ++ domanda così un C ho rimosso quel tag. –

risposta

5

Data una singola immagine e nessun'altra informazione, non esiste un'unica soluzione per gli angoli. Considera il caso di Yaw. Proiettato sul piano 2d, questo è visibile come un piccolo cambiamento nella distanza proiettata tra gli occhi e il posizionamento degli occhi rispetto al naso/bocca. Tuttavia, questa distanza non è costante da persona a persona.

Un modo tipico è richiedere all'utente di "calibrare" il proprio volto guardando direttamente la telecamera per gli angoli nominali "0". A questo punto, ora hai lunghezze di riferimento rispetto alle quali puoi confrontare le immagini successive.

Le lunghezze non sono ancora abbastanza informazioni, tuttavia, poiché la quantità delle distanze proiettate apparenti varia a seconda dell'ottica e della distanza del volto dalla telecamera. L'ottica che di solito si configura manualmente; la distanza che è possibile stimare assumendo dimensioni facciali 'medie' e assumendo che l'immagine 'nominale' corrisponda perfettamente a tali dimensioni. Puoi renderlo regolabile se trovi che sta sovrastimando o sottostimando le rotazioni per un particolare volto.

Una volta che tutti questi presupposti sono in atto, è una geometria abbastanza semplice. Puoi stimare il tiro dalla linea dagli occhi attraverso il naso alla bocca. È possibile misurare la spaziatura tra gli occhi per stimare l'imbardata. Infine, puoi stimare il tono usando la spaziatura tra occhi/bocca o occhi/naso. Tenete a mente, queste ipotesi funzionano meglio quando la faccia è ancora abbastanza vicina al nominale.

+0

Ma mi piacerebbe conoscere qualche metodo in C++ per farlo. –

0

Quindi, si desidera trovare l'orientamento (in angoli di RPY) di una faccia in base alla posizione del naso, degli occhi e della bocca. Supponendo che tutti e tre (quattro - due occhi) siano visibili, utilizzerei le caratteristiche simmetriche del viso per determinare l'orientamento della testa, ad esempio:

Una linea tra gli occhi potrebbe essere utilizzata come riferimento per uno dei assi (per esempio il Passo). Quindi, possiamo assumere che l'asse del rullo punti nella direzione del naso - che può essere misurato attraverso lo spostamento posizionale del naso al punto medio tra gli occhi. Infine, l'imbardata potrebbe essere misurata attraverso la relazione di distanza tra il punto medio tra gli occhi, la posizione del naso e la posizione della bocca.

Non conosco le relazioni a distanza tra i quattro punti di interesse e probabilmente sono diversi per sesso, età e origine. Tuttavia, se riesci a trovare una tale relazione, la derivazione degli angoli dovrebbe essere matematicamente piuttosto diretta.

Interessante applicazione a proposito!

0

Se si utilizza un classificatore a cascata per rilevare l'occhio destro, l'occhio sinistro e il naso, calcolare il centroide di ciascuna funzione (funzione x/2, funzione y/2), questo vi darà tre punti x-y sull'immagine.

È possibile rilevare il rotolo osservando i valori Y di ciascun occhio, se uno è più alto dell'altro, significa che la testa è inclinata nella direzione del valore Y più basso (mentre un occhio si sposta verso l'alto, l'altro si sposta verso il basso

È possibile rilevare l'imbardata osservando il valore X del naso, se l'utente guarda a sinistra, il valore X del loro naso sarà più vicino al valore X dell'occhio sinistro, e lo stesso con lo sguardo a destra al valore X degli occhi giusti.

È possibile rilevare l'intonazione osservando il valore Y del naso, se l'utente sta guardando verso l'alto, il valore Y sarà più vicino ai valori di entrambi gli occhi Y e se guardano in basso, il valore Y sarà più lontano da il valore dell'occhio

Ora, questo è, naturalmente, non tremendamente accurate e non si darà angoli precisi, tuttavia è possibile utilizzare queste informazioni per cercare di classificare ogni valore entro certi gruppi vale a dire (in attesa, guardando a sinistra, guardando davvero a sinistra)

L'unica cosa che posso vedere calcolando tutti e tre in un'immagine può essere se il rotolo è abbastanza drastico calcolare l'imbardata potrebbe essere fastidioso poiché l'asse X non è più piatto.

È possibile risolvere questo problema correggendo l'immagine attraverso la rotazione 2D. Avrete bisogno di trovare quanto l'immagine deve essere ruotata con

Value = (right eye Y/2) - (left eye Y/2) 

Con queste informazioni è possibile correggere l'immagine e continuare con l'elaborazione (per ruotare l'immagine cercare di creare una matrice di rotazione 2D e utilizzando ordito affine)

Scusate se questo è un po 'un necro ma ho trovato il metodo di cui sopra per essere abbastanza successo e spero che aiutare qualcuno

Problemi correlati