2012-02-26 15 views
5

Sto lavorando a un progetto in cui dovrei progettare un'applicazione in grado di rilevare tutti i volti delle persone che passano ... Ho un database molto grande che comprende diverse persone conosciute ... Ho usato EigenObjectRecognizer per riconoscere la cornice dell'immagine catturata dalla webcam ... Ma a volte il problema riconosce alcune persone in modo errato ... Quindi, se ottieni il valore di confidenza di questa corrispondenza facciale ... Allora posso scrivere un ciclo condizionale in modo che se è maggiore oltre il 75%, quindi non lo rilevo altrimenti. Inoltre so che il riconoscimento basato su PCA è fondamentale, passerò sicuramente ad altri nuovi algoritmi. Ma a causa della scadenza del progetto, dovrei presentarlo rapidamente ... Per favore, dimmi come ottenere il valore di confidenza di questo riconoscimento facciale EigenObjectRecognizer ....Come ottenere il valore di confidenza nel riconoscimento del volto utilizzando EMGU CV?

risposta

7

Non esiste un valore di confidenza esatto tuttavia th ere è una scala variabile che può essere utilizzata e approssimativamente interpretata come tale che è la distanza Eigen.

Il valore che classifica come una buona corrispondenza cambia in base alla quantità di dati che hai e ai parametri di allenamento in modo che dovrai testare i valori con facce diverse per calcolare la soglia.

Sarà necessario aggiungere una funzione alla classe Eigen per ottenere questo valore. Per prima cosa sovrascriviamo EigenObjectRecognizer che usiamo. Questo è davvero molto semplice per il file EigenObjectRecognizer.cs, si trova nella directory \ EMGU Installation \ Emgu.CV o dove hai estratto i file dovresti essere in grado di lacularlo perché è nella stessa cartella della cartella bin con tutti i file .dll che usi.

Aggiungere il file al progetto facendo clic con il pulsante destro del mouse sul nome del progetto in solution explorer in visual studion e selezionando Aggiungi> Elemento esistente ... Passare al file e aggiungerlo. Il tuo progetto utilizzerà automaticamente questo anziché quello tenuto con EMGU.CV.dll nei tuoi riferimenti.

Aprire EigenObjectRecognizer.cs ora nel progetto, non preoccuparti è una copia dell'originale in modo che qualsiasi modifica apportata non influenzi la fonte originale. Per cominciare, rendi le cose più facili tenendo premuto il tasto Ctrl, premendo il tasto m seguito dal tasto o, questo comprime tutti i campi del metodo.

Per iniziare dobbiamo sovrascrivere lo spazio dei nomi che ho chiamato il mio Emgu.Custom.

Ora nella parte superiore del codice Aggiungere la seguente variabile al di sotto gli altri

private float eigenDistance; 

Aggiungere il seguente metodo alla classe,

/// <summary> 
    /// Get the calculated Eignen Distance for the last proceessed frame 
    /// </summary> 
    public float GetEignenDistance 
    { 
     get { return eigenDistance; } 
    } 

È possibile inserire questo ovunque, ma, ovviamente, all'interno della classe e al di fuori di un metodo, ora il bit importante. Abbiamo reso eigenDistance globale ma è stato creato privatamente quando chiamiamo il metodo .Recognize (Image image).

Trova questo metodo all'interno EigenObjectRecognizer.cs e cambiare

float eigenDistance; 

a

eigenDistance = -1; 

si potrebbe eliminare il galleggiante eigenDistance; linea ma mi piace assicurarmi che venga sovrascritto con un valore che posso osservare per un errore in quanto dovrebbe essere sempre positivo se il riconoscimento è stato applicato correttamente.Si noterà che la seguente sezione di codice comprende:

FindMostSimilarObject(image, out index, out eigenDistance, out label); 
  • indice
  • eigenDistance
  • etichetta

sono tutte le uscite disponibili per l'uso con un po 'di codifica supplementare.

Abbiamo bisogno di puntare la nostra variabile riconoscitore Eigen a scriverne uno:

Emgu.Custom.EigenObjectRecognizer recognizer; 

Ora possiamo ottenere l'EigenDistance con questa chiamata di funzione:

float EigenDistance = recognizer.GetEignenDistance; 

Spero che questo cancella le cose,

Cheers,

Chris

+0

Signore, nel mio codice di riconoscimento è il nome del riferimento a EigenObjectRecognizer ... Ho provato a utilizzare recognizer.Get_Eigen_Results. Ma non sono riuscito a trovare alcun membro con il nome "Get_Eigen_Results". Mi manca per aggiungere un riferimento qui? –

+0

Ciao, scusa Surya è una funzione che ho aggiunto alla classe Eigen aggiornerò la mia risposta di conseguenza – Chris

+0

Ciao, pensi che potrebbe funzionare se mi piacerebbe confrontare le immagini se c'è la stessa persona - controlla la distanza con il database con uno, rispetto ad altri e, infine, confrontare queste distanze? O in qualsiasi modo come confrontare 2 foto di persona che non è nel database? –