Reconnaissance faciale avec opencv

OpenCv est une bibliothèque qui permet la manipulation d’image et de flux vidéo notamment la détection de mouvement et la reconnaissance faciale, voici un petit guide pour la reconnaissance faciale avec OpenCv.

Voilà un petit guide pour lequel j’ai eu des beaucoup difficultés. Notamment pour essayer de trouver un script simple et surtout pour permettre de donner des explications. La source est sur le site technophilia.

Installation d’OpenCv

Même si cela parait inutile, je tiens à dire qu’il faut que OpenCV soit installé, si ce n’est pas le cas, suivez ce guide.

Le script pour la reconnaissance

Nous allons voir le script pas à pas.

Les bibliothèques

Nous allons commencer par inclure les bibliothèques nécessaires :

#include <opencv2/opencv.hpp>
#include <iostream>
#include <stdio.h>

Déclaration des variables

Nous allons déclarer maintenant globale ainsi que la fonction qui sera utilisée pour la détection :

void detectAndDisplay(Mat frame);

String face_cascade_name = "_CHEMIN_VERS_CLASSIFIEUR_/haarcascade_frontalface_alt.xml";
String eyes_cascade_name = "_CHEMIN_VERS_CLASSIFIEUR_/haarcascade_eye_tree_eyeglasses.xml";
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
String window_name = "Capture - Face detection";

La fonction principale

Maintenant la fonction principale :

int main(int argc, char ** argv)
{
      VideoCapture capture;
      Mat frame;
      //-- 1. Charger les fichiers de cascade
      if (!face_cascade.load(face_cascade_name)) {
           printf("--(!)Error loading face cascade");
           return -1;
      }
     if (!eyes_cascade.load(eyes_cascade_name)) {
           printf("--(!)Error loading eyes cascade");
           return -1;
      };
      //-- 2. Lire le flux video
     capture.open(0);
      if (!capture.isOpened()) { printf("--(!)Error opening video capture"); return -1; }
      while (capture.read(frame))
      {
           if (frame.empty())
           {
                printf(" --(!) No captured frame -- Break!");
                break;
           }
           //-- 3. Appliquer les classificateurs a l'image
           detectAndDisplay(frame);
           //-- Gestion du clavier
           int c = waitKey(10);
           if ((char)c == 27) { break; }
      }
      return 0;
}

La fonction de détection

Voici le code de la fonction de détection et d’affichage :

void detectAndDisplay(Mat frame)
{
      std::vector<Rect> faces;
      Mat frame_gray;
      cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
      equalizeHist(frame_gray, frame_gray);
      //-- Detecter les visages
      face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0, Size(80, 80));
      for (size_t i = 0; i < faces.size(); i++)
      {
           Mat faceROI = frame_gray(faces[i]);
           std::vector<Rect> eyes;
           //-- Dans chaque visage, detecter les yeux
           eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
           if (eyes.size() == 2)
           {
                //-- Dessiner le visage
                Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
                ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 0), 2, 8, 0);
                for (size_t j = 0; j < eyes.size(); j++)
                { //-- Dessiner les yeux
                     Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2);
                     int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);
                     circle(frame, eye_center, radius, Scalar(255, 0, 255), 3, 8, 0);
                }
           } 
      }
      //-- Afficher la cam
     imshow(window_name, frame);
}

Le résultat

Voici ce que cela donne :

Laisser un commentaire