View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS

OpencvdetectCircles

Main.OpencvdetectCircles History

Hide minor edits - Show changes to output

Added lines 40-52:

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
)

Added lines 65-75:
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 (
Changed line 5 from:
! Classe OpenCV : detectCircles()
to:
! Classe OpenCV : detectCircles(), houghCircles()
Changed line 13 from:
* Cette fonction implémente l'algorithme de Hough pour la détection de cercles dans une image en niveaux de gris.
to:
* Ces 2 fonctions identiques implémentent l'algorithme natif OpenCV de Hough pour la détection de cercles dans une %red%'''image en niveaux de gris'''%%.
Changed lines 8-11 from:
%center%%width=400px%[[Path:/mes_images/javacvpro/javacvpro_exemple_HoughCircle.png|Path:/mes_images/javacvpro/javacvpro_exemple_HoughCircle.png]]


%center%%width=400px%
[[Path:/mes_images/javacvpro/javacvpro_gsvideo_exemple_circleHough.png|Path:/mes_images/javacvpro/javacvpro_gsvideo_exemple_circleHough.png]]
to:
%center%%width=400px%[[Path:/mes_images/javacvpro/javacvpro_exemple_HoughCircle.png|Path:/mes_images/javacvpro/javacvpro_exemple_HoughCircle.png]] [[Path:/mes_images/javacvpro/javacvpro_gsvideo_exemple_circleHough.png|Path:/mes_images/javacvpro/javacvpro_gsvideo_exemple_circleHough.png]]
Added lines 9-11:


%center%%width=400px%[[Path:/mes_images/javacvpro/javacvpro_gsvideo_exemple_circleHough.png|Path:/mes_images/javacvpro/javacvpro_gsvideo_exemple_circleHough.png]]
Added lines 236-392:


// 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
Changed lines 69-76 from:
* 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
to:
* 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
Deleted line 7:
%center%Path:/mes_images/javacvpro/bandeau_javacvpro_processing_opencv_400.png
Changed line 9 from:
%center%%width=400px%[[Path:|Path:]]
to:
%center%%width=400px%[[Path:/mes_images/javacvpro/javacvpro_exemple_HoughCircle.png|Path:/mes_images/javacvpro/javacvpro_exemple_HoughCircle.png]]
Added lines 113-229:

// 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

}
Added lines 26-40:
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
)
Added lines 47-62:
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
)
Changed lines 69-70 from:
*
to:
* 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

Changed lines 81-82 from:
Aucune
to:
Renvoie un tableau d'objets Circle (classe javacvpro)
Changed line 85 from:
*
to:
* pour détecter un/des cercles dans une image en nivaux de gris
Changed lines 14-17 from:
* Cette fonction implémente l'algorithme de Hough pour la détection de cercles dans une image binarisée.

* Voir également :

to:
* Cette fonction implémente l'algorithme 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()

Added lines 51-65:
       //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
); 
Added lines 1-75:
(:notitle:)
(:include HautPageReference:)\\
[[Main.LibrairieJavacvPro|Librairie JavacvPro]]

! Classe OpenCV : detectCircles()
----

%center%Path:/mes_images/javacvpro/bandeau_javacvpro_processing_opencv_400.png
%center%%width=400px%[[Path:|Path:]]


!! Description

* Cette fonction implémente l'algorithme de Hough pour la détection de cercles dans une image binarisée.

* Voir également :

!! Déclaration source java

(:source lang=java :)

(: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:)

!! Exemple webcam

(: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/2012