View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS


Librairie JavacvPro

Classe OpenCV : detectCircles(), houghCircles()


Description

  • Ces 2 fonctions identiques implémentent l'algorithme natif OpenCV de Hough pour la détection de cercles dans une image en niveaux de gris.
  • Cette fonction se base sur la fonction native OpenCV cvHoughCircle() : http://opencv.itseez.com/modules/imgproc/doc/feature_detection.html#houghcircles
  • La fonction native utilise un filtre de canny en interne pour la détection des contours : il faudra donc passer à la fonction le seuillage à utiliser pour le filtre de canny.
  • Voir également : canny()

Déclaration source java


public Circle[] detectCircles (
                                opencv_core.IplImage iplImgIn, // image source
                                boolean debug // drapeau affichage messages
                                )

public Circle[] detectCircles (
                opencv_core.IplImage iplImgIn, // image source
                float dpIn, // coeff diviseur de la résolution de l'accumulateur dans l'espace de Hough
                float minDistIn, // distance minmale entre
                float thresholdCannyIn, //  1er seuil du filtre Canny utilisé. Le second seuil Canny vaut seuilCannyIn/2
                float thresholdAccumulatorIn, // seuil utilisé par l'accumulateur pour prise en compte des centres des cercles.
                int minRadiusIn, // rayon minimum - mettre 0 par défaut
                int maxRadiusIn, // rayon maximum - mettre 0 par défaut
                boolean debug // drapeau affichage messages
                )              

public Circle[] houghCircles (
                opencv_core.IplImage iplImgIn, // image source
                float dpIn, // coeff diviseur de la résolution de l'accumulateur dans l'espace de Hough
                float minDistIn, // distance minmale entre
                float thresholdCannyIn, //  1er seuil du filtre Canny utilisé. Le second seuil Canny vaut seuilCannyIn/2
                float thresholdAccumulatorIn, // seuil utilisé par l'accumulateur pour prise en compte des centres des cercles.
                int minRadiusIn, // rayon minimum - mettre 0 par défaut
                int maxRadiusIn, // rayon maximum - mettre 0 par défaut
                boolean debug // drapeau affichage messages
                )              

 

Syntaxe


circlesArray=  detectCircles (
                                iplImgIn, // image source
                                debug // drapeau affichage messages
                                )

circlesArray= detectCircles (
                        iplImgIn, // image source
                        dpIn, // coeff diviseur de la résolution de l'accumulateur dans l'espace de Hough
                        minDistIn, // distance minmale entre
                        thresholdCannyIn, //  1er seuil du filtre Canny utilisé. Le second seuil Canny vaut seuilCannyIn/2
                        thresholdAccumulatorIn, // seuil utilisé par l'accumulateur pour prise en compte des centres des cercles.
                        minRadiusIn, // rayon minimum - mettre 0 par défaut
                        maxRadiusIn, // rayon maximum - mettre 0 par défaut
                        debug // drapeau affichage messages
                        )

circlesArray= houghCircles (
                        iplImgIn, // image source
                        dpIn, // coeff diviseur de la résolution de l'accumulateur dans l'espace de Hough
                        minDistIn, // distance minmale entre
                        thresholdCannyIn, //  1er seuil du filtre Canny utilisé. Le second seuil Canny vaut seuilCannyIn/2
                        thresholdAccumulatorIn, // seuil utilisé par l'accumulateur pour prise en compte des centres des cercles.
                        minRadiusIn, // rayon minimum - mettre 0 par défaut
                        maxRadiusIn, // rayon maximum - mettre 0 par défaut
                        debug // drapeau affichage messages
                        )
 

Paramètres

  • opencv : un objet OpenCV déclaré avec le constructeur OpenCV.
  • circlesArray : un tableau d'objets Circle (classe javacvpro)
  • iplImgIn : image source
  • dpIn : coeff diviseur de la résolution de l'accumulateur dans l'espace de Hough
  • minDistIn : distance minmale entre
  • thresholdCannyIn : 1er seuil du filtre Canny utilisé. Le second seuil Canny vaut seuilCannyIn/2
  • thresholdAccumulatorIn : seuil utilisé par l'accumulateur pour prise en compte des centres des cercles.
  • minRadiusIn : rayon minimum - mettre 0 par défaut
  • maxRadiusIn : rayon maximum - mettre 0 par défaut
  • debug : drapeau affichage messages

Valeur renvoyée

Renvoie un tableau d'objets Circle (classe javacvpro)

Utilisation type

  • pour détecter un/des cercles dans une image en nivaux de gris

Exemple

//opencv.detectCircles(opencv.Buffer, true);  // forme minimale
        // NB : la fonction native intègre canny threshold et threshold/2

        float seuilCanny=400;

        circlesArray=opencv.detectCircles ( // forme détaillée
                                opencv.Buffer, // opencv_core.IplImage iplImgIn, // image source
                                0.2, // float dpIn, // coeff diviseur de la résolution de l'accumulateur dans l'espace de Hough
                                10, //float minDistIn, // distance minmale entre
                                seuilCanny, // float thresholdCannyIn, //  1er seuil du filtre Canny utilisé. Le second seuil Canny vaut seuilCannyIn/2
                                20, // float thresholdAccumulatorIn, // seuil utilisé par l'accumulateur pour prise en compte des centres des cercles.
                                0, // int minRadiusIn, // rayon minimum - mettre 0 par défaut
                                0, // int maxRadiusIn, // rayon maximum - mettre 0 par défaut
                                true // boolean debug // drapeau affichage messages
                                );  

 

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 - decembre 2012
// Tous droits réservés - Licence GPLv3

// Exemple fonction detectCircles()

import monclubelec.javacvPro.*; // importe la librairie javacvPro

//import java.awt.Rectangle; // importe la classe Rectangle du langage Java
// l'objet rectangle fournit les champs x,y du centre et hauteur/largeur (height/width) du rectangle

PImage img;

Circle[] circlesArray=null; // tableau pour la détection des cercles


String url="http://www.mon-club-elec.fr/mes_images/online/ball.jpg"; // String contenant l'adresse internet de l'image à utiliser
//String url="/home/hinault/Bureau/trans/contour1.png"; // String le chemin absolu 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,"jpg"); // 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

        //--- initialise fenêtre Processing
        size (opencv.width()*2, opencv.height()*2); // 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

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

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

        //--- application du filtre mixerRGBGray()
        //opencv.mixerRGBGray(); // applique mixeur RGBGray sur le buffer principal OpenCV avec paramètres par défaut (1.0, 1.5,-2.0
        opencv.mixerRGBGray(1.0,1.5, -2.0); // mixerRGBGray appliqué sur objet IplImage avec paramètres - ici détection couleur orangée
        //image(opencv.getBuffer(),opencv.width(),0); // affiche le buffer principal OpenCV dans la fenêtre Processing

        //opencv.gray();

        //--- application d'un seuillage binaire ---
        opencv.threshold(0.8, "BINARY"); // seuillage binaire pour éliminer le fond


        //--- application sobel ---
        //opencv.sobel();

        //opencv.blur(5); // flou

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


        //detection des cercles

        //opencv.detectCircles(opencv.Buffer, true);  // forme minimale
        // NB : la fonction native intègre canny threshold et threshold/2

        float seuilCanny=400;

        circlesArray=opencv.detectCircles ( // forme détaillée
                                opencv.Buffer, // opencv_core.IplImage iplImgIn, // image source
                                0.2, // float dpIn, // coeff diviseur de la résolution de l'accumulateur dans l'espace de Hough
                                10, //float minDistIn, // distance minmale entre
                                seuilCanny, // float thresholdCannyIn, //  1er seuil du filtre Canny utilisé. Le second seuil Canny vaut seuilCannyIn/2
                                20, // float thresholdAccumulatorIn, // seuil utilisé par l'accumulateur pour prise en compte des centres des cercles.
                                0, // int minRadiusIn, // rayon minimum - mettre 0 par défaut
                                0, // int maxRadiusIn, // rayon maximum - mettre 0 par défaut
                                true // boolean debug // drapeau affichage messages
                                );  

        //--- pour estimation effet du Canny en interne fonction detectCirles -- affiche après détection l'effet du Canny sur le Buffer
        opencv.canny(seuilCanny,seuilCanny/2);
        image(opencv.getBuffer(),0,opencv.height()); // affiche le buffer principal OpenCV dans la fenêtre Processing

        //-- réaffichage image de départ --
        image(img,opencv.width(), opencv.height());

        // -- dessine les cercles
        opencv.drawCircles ( // trace le tableau d'objet Circles
                                circlesArray, // Circle[] circlesIn, // le tableau de cercles à tracer
                                opencv.width(),opencv.height(), //int xRefIn, int yRefIn, // les coordonnées du cercle à tracer
                                1, // float scaleIn, // l'échelle à utiliser
                                1, // radiusScaleIn, // échelle à utiliser pour le rayon
                                color(255,255,0), 1, // int colorStrokeIn, int strokeWeightIn, // couleur et épaisseur du pourtour du cercle
                                false, 0, //boolean fillIn, int colorFillIn, // drapeau de remplissage et couleur de remplissage
                                true // boolean debugIn // drapeau d'affichage des messages
                                );

           //--- alternative - dessine les centres des cercles
           opencv.drawCenterCircles (
                                circlesArray, // Circle[] circlesIn, // le tableau de cercles à tracer
                                opencv.width(),opencv.height(), //int xRefIn, int yRefIn, // les coordonnées du cercle à tracer
                                1, // float scaleIn, // l'échelle à utiliser
                                5,// int radiusIn, // rayon à utiliser
                                color(255,0,0), 1, // int colorStrokeIn, int strokeWeightIn, // couleur et épaisseur du pourtour du cercle
                                true, color(255,0,0), //boolean fillIn, int colorFillIn, // drapeau de remplissage et couleur de remplissage
                                true // boolean debugIn // drapeau d'affichage des messages
                                );


       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 selectBallBlobs - extraction de contour de formes binarisées

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

PImage img;

Circle[] circlesArray=null; // tableau pour la détection des cercles

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*2, heightCapture*2); // 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/video1", 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

}


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); // autre possibilité - charge directement 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(opencv.getBuffer(),0,0); // affiche le buffer principal OpenCV dans la fenêtre Processing

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

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

        //--- application du filtre mixerRGBGray()
        //opencv.mixerRGBGray(); // applique mixeur RGBGray sur le buffer principal OpenCV avec paramètres par défaut (1.0, 1.5,-2.0
        opencv.mixerRGBGray(1.0,1.5, -2.0); // mixerRGBGray appliqué sur objet IplImage avec paramètres - ici détection couleur orangée
        //image(opencv.getBuffer(),opencv.width(),0); // affiche le buffer principal OpenCV dans la fenêtre Processing

        //opencv.gray();

        opencv.blur();

        //--- application d'un seuillage binaire ---
        opencv.threshold(0.6, "BINARY"); // seuillage binaire pour éliminer le fond


        //--- application sobel ---
        //opencv.sobel();

        //opencv.blur(5); // flou

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


        //detection des cercles

        //opencv.detectCircles(opencv.Buffer, true);  // forme minimale
        // NB : la fonction native intègre canny threshold et threshold/2

        float seuilCanny=400;

        circlesArray=opencv.detectCircles ( // forme détaillée
                                opencv.Buffer, // opencv_core.IplImage iplImgIn, // image source
                                0.1, // float dpIn, // coeff diviseur de la résolution de l'accumulateur dans l'espace de Hough
                                10, //float minDistIn, // distance minmale entre
                                seuilCanny, // float thresholdCannyIn, //  1er seuil du filtre Canny utilisé. Le second seuil Canny vaut seuilCannyIn/2
                                15, // float thresholdAccumulatorIn, // seuil utilisé par l'accumulateur pour prise en compte des centres des cercles.
                                0, // int minRadiusIn, // rayon minimum - mettre 0 par défaut
                                0, // int maxRadiusIn, // rayon maximum - mettre 0 par défaut
                                true // boolean debug // drapeau affichage messages
                                );  

        //--- pour estimation effet du Canny en interne fonction detectCirles -- affiche après détection l'effet du Canny sur le Buffer
        opencv.canny(seuilCanny,seuilCanny/2);
        image(opencv.getBuffer(),0,opencv.height()); // affiche le buffer principal OpenCV dans la fenêtre Processing

        //-- réaffichage image de départ --
        image(img,opencv.width(), opencv.height());

        // -- dessine les cercles
        opencv.drawCircles ( // trace le tableau d'objet Circles
                                circlesArray, // Circle[] circlesIn, // le tableau de cercles à tracer
                                opencv.width(),opencv.height(), //int xRefIn, int yRefIn, // les coordonnées du cercle à tracer
                                1, // float scaleIn, // l'échelle à utiliser
                                1, // radiusScaleIn, // échelle à utiliser pour le rayon
                                color(255,255,0), 1, // int colorStrokeIn, int strokeWeightIn, // couleur et épaisseur du pourtour du cercle
                                false, 0, //boolean fillIn, int colorFillIn, // drapeau de remplissage et couleur de remplissage
                                true // boolean debugIn // drapeau d'affichage des messages
                                );

           //--- alternative - dessine les centres des cercles
           opencv.drawCenterCircles (
                                circlesArray, // Circle[] circlesIn, // le tableau de cercles à tracer
                                opencv.width(),opencv.height(), //int xRefIn, int yRefIn, // les coordonnées du cercle à tracer
                                1, // float scaleIn, // l'échelle à utiliser
                                5,// int radiusIn, // rayon à utiliser
                                color(255,0,0), 1, // int colorStrokeIn, int strokeWeightIn, // couleur et épaisseur du pourtour du cercle
                                true, color(255,0,0), //boolean fillIn, int colorFillIn, // drapeau de remplissage et couleur de remplissage
                                true // boolean debugIn // drapeau d'affichage des messages
                                );


        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

Aucun

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