View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS

Opencvdetect

Main.Opencvdetect History

Hide minor edits - Show changes to output

Added lines 171-273:
// 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

Changed lines 279-280 from:
** de 72 ms en mode "interprété"  soit une fréquence maximale potentielle de 1.3 fps.
** de 72 ms en mode "compilé"  soit une fréquence maximale potentielle de 1.3 fps.
to:
** de 100 ms sans coeff en mode "interprété"  soit une fréquence maximale potentielle de 10 fps.
** %red%de 48 ms avec coeff x2 en mode "interprété"  soit une fréquence maximale potentielle de 20 fps. 
** %red%de 30 ms sans coeff x 3 en mode "interprété"  soit une fréquence maximale potentielle de 30 fps = max webcam.
Changed lines 32-33 from:
to:
public Rectangle[] detect(int coeffIn, boolean debugIn)
Added line 48:
faceRect=opencv.detect(coeff, debug); // applique la détection au buffer principal
Added line 75:
* coeff : coefficient qui influe directement sur la vitesse de détection : plus ce coefficient est élevé et plus la vitesse de détection est élevée. Mettre à 2 voir 3 pour obtenir un framerate de 30 fps en 320x240.
Added lines 161-166:

(:sourcend:)

!! Exemple webcam

(:source lang=processing:)
Changed lines 136-137 from:
       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
to:
       //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 - préférable
        opencv.cascade("/usr/local/share/OpenCV/haarcascades/","haarcascade_frontalface_alt.xml"); // utilise chemin absolu Rép + nom fichier - préférable
Added line 24:
* noter que le fait d'utilise une image en niveau de gris ne modifie pas significativement la durée d'exécution.
Added lines 20-25:
>>warning<<
%red% ATTENTION : cette fonction est très gourmande en ressource processeur%%. Pour limiter le taux d'utilisation de la CPU en cas d'analyse en direct d'un flux vidéo webcam :
* utiliser un framerate bas (10 à 15 fps) pour le programme
* utiliser une petite dimension pour l'image à analyser : 320x240 voire même 160x120 ce qui donnera un bon résultat de détection avec une rapidité d'analyse acceptable.
>><<

Added lines 162-166:
!! Durée d'exécution de la fonction

* La réalisation de 100 exécutions successives de la fonction dans Processing (sur un Intel Dual Core à 2.33Gz sous Ubuntu 10.04 LTS avec la version OpenCV 2.3.1) pour une image de 320x240 donne une durée moyenne pour chaque exécution de :
** de 72 ms en mode "interprété"  soit une fréquence maximale potentielle de 1.3 fps.
** de 72 ms en mode "compilé"  soit une fréquence maximale potentielle de 1.3 fps.
Changed line 106 from:
import monclubelec.javacvProc.*; // importe la librairie javacvPro
to:
import monclubelec.javacvPro.*; // importe la librairie javacvPro
Changed line 12 from:
* Cette fonction est la fonction essentielle de détection d'objet ou de visage, une fois qu'un fichier de description a été chargé. Cette fonction renvoie un tableau d'objets Rectangle correspondant aux rectangles encadrant les objets détectés.
to:
* Cette fonction est la fonction essentielle de détection d'objet ou de visage, une fois qu'un fichier de description a été chargé à l'aide de la fonction cascade(). Cette fonction renvoie un tableau d'objets Rectangle correspondant aux rectangles encadrant les objets détectés.
Changed line 5 from:
! Classe OpenCV : ()
to:
! Classe OpenCV : detect()
Changed lines 8-9 from:
%center%Path:
to:
%center%Path:/mes_images/javacvpro/javacvpro_exemple_cascade_detect.png
Changed lines 91-92 from:
to:
faceRect = opencv.detect(true); // détection des visages avec messages debug
Added lines 99-151:

// 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.javacvProc.*; // 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

}
Changed lines 14-17 from:


* Voir également :
to:
* Cette fonction est basée sur la fonction OpenCV native cvHaarDetectObjects() : http://opencv.willowgarage.com/documentation/c/objdetect_cascade_classification.html#haardetectobjects

* Le tableau des rectangles détectés est mémorisé automatiquement en interne par la fonction permettant l'utilisation simplifiée de la fonction drawRectDetect() pour tracer les rectangles.

* Voir également : cascade(); drawRectDetect()

Added lines 35-36:
!!! Forme simplifiée :
* Afin de faciliter l'utilisation de la fonction detect(), la librairie javacvPro implémente plusieurs formes simplifiées en utilisant en interne des paramètres de détection par défaut. 
Changed lines 38-41 from:
to:
faceRect=opencv.detect(); // applique la détection au buffer principal
faceRect=opencv.detect(debug); // applique la détection au buffer principal
faceRect=opencv.detect(iplImg); // applique la détection à l'objet IplImage
faceRect=opencv.detect(iplImg, debug); // applique la détection à l'objet IplImage
Changed lines 44-54 from:
to:
* Les paramètres de détection par défaut utilisés par ces fonctions sont  (voir ci-dessous pour les détails) :
(:source lang=processing :)
detect( iplImgIn, (float)1.2, 2, opencv_objdetect.CV_HAAR_DO_CANNY_PRUNING, p.width/16, p.height/16, p.width, p.height, false  )
(:sourcend:)

!!! Forme détaillée :
* La forme complète qui se superpose à la fonction de détection OpenCV native est également disponible :
(:source lang=processing :)
faceRect=detect(iplImg, scale, min_neighbors, flags, min_width, min_height, max_width, max_height, debug  );
(:sourcend:)

Added line 57:
!!! Forme simplifiée
Changed lines 59-60 from:
*
to:
* drawRect : un tableau d'objet Rectangle. Pour plus d'informations sur la classe java Rectangle, voir : http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Rectangle.html Nécessite d'utiliser dans votre programme l'import suivant :
(:source lang=processing :)
import java.awt.*; // pour classes Point , Rectangle..)
(:sourcend:)

* iplImg : Un objet IplImage ou un buffer
* debug : drapeau d'activation des messages de debug. true : messages activés, false : messages inactivés.

!!! Forme détaillée
* scale : facteur d'échelle. Utiliser 1.2.
* min_neighbors : nombre minimum de rectangles voisins qui composent un objet. Au moins 1. Utiliser 2.
* flags : mode de détection. Utiliser : CV_HAAR_DO_CANNY_PRUNING
* min_width : largeur minimale en pixels pour objet détecté - Minimum 20
* min_height : hauteur minimale en pixels pour objet détecté - Minimum = 20
* max_width : largeur maximale en pixels pour objet détecté
* max_height : hauteur maximale en pixels pour objet détecté

>>important<<
Pour plus de détails sur les paramètres de la forme détaillée, voir : http://opencv.willowgarage.com/documentation/c/objdetect_cascade_classification.html#haardetectobjects
>><<

Changed lines 82-86 from:
Aucune

!! Utilisation type

*
to:
* Renvoie le tableau d'objets Rectangle correspondant aux rectangles encadrants les objets détectés. Pour plus d'informations sur la classe java Rectangle, voir : http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Rectangle.html

* A noter que le nombre d'objets détectés est accessible par la propriété .length du tableau.
Added lines 1-77:
(:notitle:)
(:include HautPageReference:)\\
[[Main.LibrairieJavacvPro|Librairie JavacvPro]]

! Classe OpenCV : ()
----

%center%Path:

!! Description

* Cette fonction est la fonction essentielle de détection d'objet ou de visage, une fois qu'un fichier de description a été chargé. Cette fonction renvoie un tableau d'objets Rectangle correspondant aux rectangles encadrant les objets détectés.



* Voir également :

!! Déclaration source java

(:source lang=java :)
public Rectangle[] detect()
public Rectangle[] detect(boolean debugIn)

public Rectangle[] detect(opencv_core.IplImage iplImgIn)
public Rectangle[] detect(opencv_core.IplImage iplImgIn, boolean debugIn)

public Rectangle[] detect( opencv_core.IplImage iplImgIn, float scaleIn, int min_neighborsIn, int flagsIn, int min_widthIn, int min_heightIn, int max_widthIn, int max_heightIn, boolean debugIn  )

(:sourcend:)

!! Syntaxe

(:source lang=processing :)

(:sourcend:)


!! Paramètres

* opencv : un objet OpenCV déclaré avec le constructeur [[OpencvOpencv|OpenCV]].
*

!! Valeur renvoyée

Aucune

!! Utilisation type

*

!! Exemple

(:source lang=processing :)


(:sourcend:)

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


(:source lang=processing :)


(:sourcend:)


!! Commentaires utilisateurs

>>bgcolor=#dfd border='3px dotted green'<<

Aucun

>><<

(:include BasPageReference:)

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