[Tutorial OpenCV] Riconoscimento delle facce

Face Detection
Face Detection
Face Detection

Il tutorial che segue illustrerà come realizzare un semplice Face Detector: un programma in grado di identificare tutte le facce presenti in ogni frame di un flusso video proveniente da un camera digitale (una webcam in questo caso particolare). Per ogni faccia individuata sarà inoltre possibile scegliere se riconoscere anche la zona degli occhi, del naso e della bocca. Il tutorial utilizza un Widget Qt OpenGL (parte 1parte 2) per visualizzare le immagini OpenCV in una GUI. Il codice che andrò a illustrarvi è la base degli strumenti automatici (autoscatto sul sorrisi, autoscatto con occhi aperti, ecc) che ormai si trovano in tutte le macchine fotografiche digitali di ultima generazione. Il tutorial vi permetterà di realizzare un’applicazione come quella mostrata nel seguente video:

La Face Detection sfrutta l’algoritmo “Cascade Classification” implementato in OpenCV e addestrato a riconoscere facce, occhi, nasi e bocche. In questo caso particolare un primo classificatore si occuperà innanzitutto di identificare tutte le facce presenti nell’immagine analizzata, quindi per ogni faccia tre diversi classificatori identificheranno gli occhi, il naso e la bocca. Iniziamo dal codice sorgente realizzato per la seconda parte del tutorial sul Widget Qt, che potete reperire qui. Prima di tutto aggiungiamo al progetto il modulo OpenCV di “Object Detection”, apriamo il file “pro” e aggiungiamo il modulo della libreria:

Nel file della finestra principale della GUI inseriamo il seguente codice di inclusione:

e le seguenti variabili private:

Nella funzione di “Start” della camera dobbiamo verificare che i classificatori siano inizializzati:

I classificatori per essere inizializzati hanno bisogno di quattro file, definiti con delle MACRO:

i quattro file devono essere copiati dalla cartella “[OpenCV]/data/haarcascades” nella cartella in cui viene generato l’eseguibile del nostro programma. Inizializzati i classificatori è possibile utilizzarli ogni volta che la webcam ci fornirà una nuova immagine, cioè all’interno della funzione di gestione del timer (vd tutorial precedente):

Il codice è molto articolato, di seguito una descrizione riga per riga:

  • [3]: Verifica dell’ID del Timer che ha scatenato l’evento
  • [6]: Interruzione momentanea del timer in modo che la webcam non scateni nessun nuovo evento durante l’elaborazione dell’ultima immagine acquisita
  • [8]: Acquisizione dell’immagine
  • [10]: Copia dell’immagine originale in modo che le elaborazioni non la rovinino
  • [12]: Ricerca delle facce solo se abilitata (vd filmato di esempio)
  • [14]: Vettore contenente i Bounding Rect delle facce identificate
  • [16]: Parametro di scala per l’identificazione delle facce (vd documentazione OpenCV per maggiori dettagli
  • [17]: Ricerca delle facce nelle immagini. Questa funzione popolerà il vettore “faceVec” con tutti i rettangoli che contengono le facce identificate.
  • [20]: il “for” serve ad eseguire le elaborazioni di seguito descritte per ogni faccia identificata.
  • [22]: disegno in rosso del rettangolo della faccia corrente. Il rettangolo è disegnato su “mElabImage” in modo che l’immagine originale non venga sporcata per le successive elaborazioni.
  • [24]: estrazione dall’immagine originale della porzione che contiene unicamente la faccia analizzata. In questo modo possono essere estratte le “sottoparti” solo dalla faccia corrente.
  • [28]: verifica dell’attivazione della ricerca degli occhi
  • [30]: vettore contenente i rettangoli relativi alla zona degli occhi.
  • [32]: ricerca degli occhi
  • [34-41]: disegno dei rettangoli degli occhi (normalmente il rettangolo è uno solo visto che ognuno di noi ha solo due occhi 😉 )
  • [45-85]: analogamente a quanto fatto per gli occhi, sono ricercati il naso e la bocca.
  • [67-70]: per migliorare il risultato finale la bocca è ricercata solo nella metà inferiore della faccia.
  • [89]: visualizzazione del risultato
  • [95]: riattivazione del timer per l’acquisizione dell’immagine successiva

Il tutorial è giunto alla conclusione. Grazie a OpenCV un’operazione molto complessa come quella di riconoscere le facce e le loro sotto-parti può essere implementata con solo 70-80 righe di codice. Dietro queste 80 righe di codice ci sono anni e anni di studi sull’intelligenza artificiale e il machine learning e vi invito a leggere la documentazione OpenCV per riendervi conto cosa effettivamente ci sia dietro.

 

FaceDetection
FaceDetection
FaceDetection.rar
Versione: 1.0
6.7 KiB
937 Downloads
Dettagli

9 Responses

  1. djvita says:

    so i got this running in qt linux…however instead of turning on my webcam and being able to see my face, I get a screenshot…how do i change for it to be a webcam, i reviewed the code and i dont see where the camera is initilized, just a nested of to recognize,
    thanks for your help

    • Myzhar says:

      Hi, there’s something strange in what you are saying….
      If I can understand well, I say that camera is initialized here:
      [code]
      if( !mCapture.isOpened() )
      {

      mCapture.open(0);
      mCameraEventId = startTimer( 50 );
      }
      [/code]
      It is a standard OpenCV initialization code for the streaming from the default webcam connected to your system.

      In the “timerEvent” function you get all the frames.
      Be sure that
      [code]
      // Timer reactivation
      mCameraEventId = startTimer( 50 );
      [/code]
      is called at the end of “timerEvent”, otherwise you will not get the next frame.

      • djvita says:

        oh man stupid me! I saw your video and i found the label to turn ON the camera…so it runs now…i found where to copy the cascade files (no errors now, i had the qdebugs before), but it won’t detect my face, nor eyes mouth or nose…any suggestions?

        • djvita says:

          forget it I see it detects at a certain distance(i was too close to my webcam), very good! thanks for the tutorial! now to play around with this….hopefully to recognize and save faces like a login

          • Myzhar says:

            I’m happy you made it working 🙂
            What do you think about the new style of the site?

          • djvita says:

            Much cleaner and easier to read (larger font?) more modern good job!
            though I would put the languages, latest articles and ads div in the right side also, so as to let your content have more space, its centered right now very narrow and the code snippets are partially hidden, i found myself scrolling to the left inside the snippets to see whats going on…just my 2 cents…cheers

  2. janan says:

    please the file is deleted can you re-upload it
    thnanks

    • Myzhar says:

      There is an issue with the “multilanguage” plugin… move to “Italian” and you can download it without any issue.

      I’m going to solve this problem as soon as possible

      • janan says:

        ok thanks it worked but now i have some errors :

        /usr/bin/ld: cmainwindow.o: undefined reference to symbol ‘_ZN2cv3MatC1ERKS0_RKNS_5Rect_IiEE’
        //usr/local/lib/libopencv_core.so.2.4: error adding symbols: DSO missing from command line
        collect2: error: ld returned 1 exit status

        i’m using opencv 2.4.10 and ubuntu 14.04 and QT 4.8.6

Lascia un Commento

This site uses cookies. Find out more about this site’s cookies.
%d bloggers like this: