View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS


Librairie JavacvPro

Classe OpenCV : cascade()


Description

  • Cette fonction charge le fichier de description à utiliser pour une reconnaissance de visage ou d'objet. Ce fichier de description est un fichier obtenu après compilation de plusieurs centaines voire milliers d'images de l'objet à détecter sur différents fonds, éclairages, situations. Pour plus de détails, voir : http://opencv.itseez.com/modules/objdetect/doc/cascade_classification.html#haar-feature-based-cascade-classifier-for-object-detection
  • La fonction cascade() permet de charger les fichiers de description fournis par défaut avec la librairie native OpenCV (essentiellement visage et corps humain). Il est également possible de charger n'importe quel fichier de description à partir du chemin absolu et du nom du fichier.
  • La "séquence" à suivre pour écrire un programme de détection de visage ou d'objet à partir d'un fichier de description est :
    • chargement du fichier de description, à l'aide de la fonction cascade(), à mettre dans la fonction setup()
    • recherche du visage ou de l'objet, à l'aide de la fonction detect(), à mettre dans la fonction draw() typiquement dans le cas de la capture d'un flux vidéo. La fonction detect() renvoie un tableau d'objets Rectangle.
    • tracé des rectangles entourant le/les objets détectés avec la fonction drawRecDetect()
  • Grâce aux fonctions de la librairie javacvPro, il devient ainsi possible de détecter un visage et tracer le rectangle l'encadrant en 3 lignes de code !
  • Ces fonctions sont suffisamment rapides avec la librairie javacvPro pour permettre le suivi de visage en temps réel à partir d'un flux vidéo.
  • Voir également : detect(), drawRectDetect()

Déclaration source java

public void cascade(String cheminAbsoluRepIn, String nomFichierIn)
public void cascade(String classifierIn, boolean debug)

Syntaxe

opencv.cascade(mode, debug);
opencv.cascade(chemin,fichier,debug);

Paramètres

  • opencv : un objet OpenCV déclaré avec le constructeur OpenCV.
  • mode (string) : chaîne de caractères prédéfinie fixant le type de détection à utiliser parmi :
    • FRONTALFACE_ALT : visage de face
    • FRONTALFACE_ALT_TREE : variante visage face
    • FRONTALFACE_ALT2 : variante visage face
    • PROFILEFACE : visage de profil
    • FULLBODY : corps entier
    • LOWERBODY : bas de corps
    • UPPERBODY : haut de corps
  • La librairie javacvPro implémente pour le moment ces chaines de caractères uniquement sous Linux en prenant en compte le chemin suivant : /usr/share/opencv/haarcascades/
  • Dans toutes les autres situations, appeler le fichier de description à partir du chemin absolu et du nom du fichier (voir ci-dessous).
  • chemin (string) : Le chemin absolu du répertoire où se trouve le fichier descriptif. Les répertoires typiquement utilisés sont :
    • Linux (Ubuntu) :
      • "/usr/local/share/OpenCV/haarcascades/"
      • ou "/usr/share/opencv/haarcascades/"
      • ou "/usr/local/share/opencv/haarcascades/"
    • Mac : "/System/Library/Frameworks/OpenCV.framework/Resources/"
    • Windows :
      • répertoire "data/haarcascades/" dans le répertoire de la librairie OpenCV
      • Windows 7 : "C:/opencv/data/haarcascades/","haarcascade_frontalface_alt.xml"

Si vous obtenez un message d'erreur à l'exécution, assurez-vous bien de l'existence du répertoire utilisé. Vérifier également le chemin utilisé : oubli d'un "/" ?

  • fichier (string) : nom du fichier de description au format *.xml à utiliser.

A titre indicatif, la liste des fichiers disponibles avec la version 2.3.1 d'OpenCV est ( Commande ls du répertoire /usr/share/opencv/haarcascades/ ):

  • haarcascade_eye_tree_eyeglasses.xml
  • haarcascade_frontalface_alt.xml
  • haarcascade_lowerbody.xml
  • haarcascade_mcs_mouth.xml
  • haarcascade_profileface.xml
  • haarcascade_eye.xml
  • haarcascade_frontalface_default.xml
  • haarcascade_mcs_eyepair_big.xml
  • haarcascade_mcs_nose.xml
  • haarcascade_righteye_2splits.xml
  • haarcascade_frontalface_alt2.xml
  • haarcascade_fullbody.xml
  • haarcascade_mcs_eyepair_small.xml
  • haarcascade_mcs_righteye.xml
  • haarcascade_upperbody.xml
  • haarcascade_frontalface_alt_tree.xml
  • haarcascade_lefteye_2splits.xml
  • haarcascade_mcs_lefteye.xml
  • haarcascade_mcs_upperbody.xml
  • debug : drapeau d'activation des messages de debug lors de l'exécution de la fonction. true : messages activés, false : messages désactivés.

Valeur renvoyée

Aucune. Le fichier de description est chargé par la librairie et sera utilisé par la fonction detect().

Exemple

  • Typiquement, la fonction cascade() est à mettre dans la fonction setup() et est exécutée une fois pour toute.
opencv.cascade("FRONTALFACE_ALT", true); // initialise détection de visage
opencv.cascade("/usr/share/opencv/haarcascades/","haarcascade_frontalface_alt.xml"); // utilise chemin absolu Rép + nom fichier - Linux

L'exemple complet suivant est à copier dans Processing et est exécutable immédiatement si vous êtes connectés à internet :


// Programme d'exemple de la librairie javacvPro
// par X. HINAULT - octobre 2011
// Tous droits réservés - Licence GPLv3

// Exemple fonction cascade), detect() et drawRectDetect()

import monclubelec.javacvPro.*; // importe la librairie javacvPro
import java.awt.*; // pour classes Point , Rectangle..

PImage img;

Rectangle[] faceRect;

String url="http://www.mon-club-elec.fr/mes_images/online/lena.jpg"; // String contenant l'adresse internet de l'image à utiliser

OpenCV opencv; // déclare un objet OpenCV principal

void setup(){ // fonction d'initialisation exécutée 1 fois au démarrage

        //-- charge image utilisée ---
        img=loadImage(url); // crée un PImage contenant le fichier à partir adresse web

        //--- initialise OpenCV ---
        opencv = new OpenCV(this); // initialise objet OpenCV à partir du parent This
        opencv.allocate(img.width, img.height); // initialise les buffers OpenCv à la taille de l'image

        opencv.copy(img); // charge le PImage dans le buffer OpenCV

        //-- charge le fichier de description ---        
        opencv.cascade("FRONTALFACE_ALT", true); // initialise détection de visage
        //opencv.cascade("/usr/share/opencv/haarcascades/","haarcascade_frontalface_alt.xml"); // utilise chemin absolu Rép + nom fichier

        //--- initialise fenêtre Processing
        size (opencv.width(), opencv.height()); // crée une fenêtre Processing de la taille du buffer principal OpenCV
        //size (img.width, img.height); // aalternative en se basant sur l'image d'origine

        //--- affiche image de départ ---        
        image(opencv.getBuffer(),0,0); // affiche le buffer principal OpenCV dans la fenêtre Processing

        faceRect = opencv.detect(true); // détection des visages avec messages debug

        opencv.drawRectDetect(true); // affiche les rectangles détectés avec messages debug

        println("Nombre de visages de face détectés =" + faceRect.length + ".");

       noLoop(); // stop programme        
}


void  draw() { // fonction exécutée en boucle

}
 

Exemple webcam

// Programme d'exemple de la librairie javacvPro
// par X. HINAULT - Mars 2012
// Tous droits réservés - Licence GPLv3

// Exemple fonction Cascade  - détection de visages

import codeanticode.gsvideo.*; // importe la librairie vidéo GSVideo qui implémente GStreamer pour Processing (compatible Linux)
// librairie comparable à la librairie native vidéo de Processing (qui implémente QuickTime..)- Voir Reference librairie Video Processing
// cette librairie doit être présente dans le répertoire modes/java/libraries du répertoire Processing (1-5)
// voir ici : http://gsvideo.sourceforge.net/

import monclubelec.javacvPro.*; // importe la librairie javacvPro
import java.awt.*; // pour classes Point , Rectangle..

PImage img;
Rectangle[] faceRect;

GSCapture cam; // déclare un objet GSCapture représentant une webcam
// L'objet GSCapture étend PImage - se comporte comme un conteneur des frames issues de la webcam

OpenCV opencv; // déclare un objet OpenCV principal

int widthCapture=320; // largeur image capture
int heightCapture=240; // hauteur image capture
int fpsCapture=30; // framerate de Capture

int millis0=0; // variable mémorisation millis()

void setup(){ // fonction d'initialisation exécutée 1 fois au démarrage

        //--- initialise fenêtre Processing
        size (widthCapture, heightCapture); // crée une fenêtre Processing de la 2xtaille du buffer principal OpenCV
        //size (img.width, img.height); // aalternative en se basant sur l'image d'origine
        frameRate(fpsCapture); // taux de rafraichissement de l'image

       //---- initialise la webcam ---
       cam = new GSCapture(this, widthCapture, heightCapture); // forme simplifiée
       //cam = new GSCapture(this, widthCapture, heightCapture,"v4l2src","/dev/video0", fpsCapture); // Initialise objet GSCapture désignant webcam - forme complète

        //--- initialise OpenCV ---
        opencv = new OpenCV(this); // initialise objet OpenCV à partir du parent This
        opencv.allocate(widthCapture, heightCapture); // initialise les buffers OpenCv à la taille de l'image

        cam.start();  // démarre objet GSCapture = la webcam

        //-- charge le fichier de description ---        
        //opencv.cascade("FRONTALFACE_ALT", true); // initialise détection de visage
        opencv.cascade("/usr/local/share/OpenCV/haarcascades/","haarcascade_frontalface_alt.xml"); // utilise chemin absolu Rép + nom fichier
        // supporte chemin absolu avec ou sans / en fin de chaine

}


void  draw() { // fonction exécutée en boucle

// Code capture GSVideo



  if (cam.available() == true) { // si une nouvelle frame est disponible sur la webcam

        //background(0);  // fond noir entre 2 images

        //------ gestion image webcam par GSCapture ------
        cam.read(); // acquisition d'un frame
        //image(cam1, 0, 0); // affiche image
        //set(0, 0, cam); // affiche image - plus rapide

        //------- gestion image par Opencv ----------

        img=cam.get(); // récupère l'image GS video dans Pimage

        millis0=millis(); // mémorise millis()  
        opencv.copy(img); // charge l'image GSVideo dans le buffer openCV
        println("Durée chargement buffer OpenCV=" + (millis()-millis0)+"ms.");

        //--- affiche image de départ avant opération sur image ---        
        image(img,0,0); // affiche le buffer principal OpenCV dans la fenêtre Processing

        //--- opérations sur image ---

        millis0=millis(); // mémorise millis()  

        //faceRect = opencv.detect(true); // détection des visages avec messages debug
        faceRect = opencv.detect(3,true); // détection des visages avec coeff vitesse élevée et messages debug

        opencv.drawRectDetect(true); // affiche les rectangles détectés avec messages debug

        println("Nombre de visages de face détectés =" + faceRect.length + ".");


        println("Durée traitement image par OpenCV=" + (millis()-millis0)+" ms.");

        //--- affiche image finale ---

        //image(opencv.getBuffer(),widthCapture,0); // affiche le buffer principal OpenCV dans la fenêtre Processing        

  } // fin if available



} // fin draw

 

Commentaires utilisateurs

  • La seule véritable difficulté ici consiste à trouver l'emplacement des fichiers de description sur son système. Une fois fait, les choses sont assez simples, puisque la fonction permet de charger tout fichier de description de son choix.

Cette page est une création originale de Xavier HINAULT - Tous droits réservés - 2011