View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS

OpencvFeature2DkeypointsSBD

Main.OpencvFeature2DkeypointsSBD History

Hide minor edits - Show changes to output

Added lines 221-345:


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

// Exemple fonction keyPointSBD - implémente Simple Blob Detector

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;

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

Keypoint[] keypointsArray=null; // déclaration d'un tableau pour le stockage des points clés


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); // 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
     
}


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 ----------
 
        //imgSrc=cam1.get(); // récupère l'image GS video dans Pimage
        //opencv.copy(imgSrc); // charge l'image dans le buffer openCV

        millis0=millis(); // mémorise millis() 
        opencv.copy(cam.get()); // 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() 

        //--- applicationmixer RGBgray ---
        opencv.mixerRGBGray(); // applique mixeur RGB sur le buffer principal OpenCV avec paramètres par défaut - détection couleur orange
               
        //--- affiche image finale ---
        image(opencv.getBuffer(),opencv.width(),0); // affiche le buffer principal OpenCV dans la fenêtre Processing

        //--- détection des points clés à l'aide du SimpleBlobDetector
        // le tableau de point clé va contenir les points des centres des Blobs sélectionnés ainsi que le rayon contenant
       
        //keypointsArray=opencv.keypointsSBD(opencv.Buffer, true); // forme simplifiée utilisant paramètres par défaut
       
        keypointsArray=opencv.keypointsSBD(  // forme complète SimpleBlobDetector       
          opencv.Buffer, // image ipl
          150, 250, 10, // float minThreshold, float maxThreshold, float thresholdStep,
  1, //float minDistBetweenBlobs,
    true, 255, // boolean filterByColor, int blobColor,
  true, 250,5000, // boolean filterByArea, float minArea, float maxArea,
  false, 0.8,1.2,// boolean filterByCircularity, float minCircularity, float maxCircularity,
  false,0,0, // boolean filterByConvexity, float minConvexity, float maxConvexity,
  false, 0,0, // boolean filterByInertia, float minInertiaRatio, float maxInertiaRatio,
  2,// long minRepeatability,
          true // debug         
          ); // fin keypointsSBD
       

        //--- dessin des points clés à partir du tableau de points clés
       
        //opencv.drawKeypoints(keypointsArray, true); // forme simplifiée utilisant paramètres par défaut
       
        opencv.drawKeypoints ( // forme complète fonction
keypointsArray, //Keypoint[] keypointsIn,
opencv.width(),0,1,//int xRefIn, int yRefIn, float scaleIn,
                -1, // int radius - utiliser -1 pour rayon des cercles = size des Keypoints
color(0,0,255), 1, //int colorStrokeIn, int strokeWeightIn,
true,color(0,0,255),//boolean fillIn, int colorFillIn,
true //boolean debug
); // fin draw keypoints
     
        println("Durée traitement image par OpenCV=" + (millis()-millis0)+" ms.");
       
   

  } // fin if available

} // fin draw
Changed line 27 from:
* Cette fonction implémente la fonction native openCv . Voir : http://opencv.itseez.com/modules/features2d/doc/common_interfaces_of_feature_detectors.html#simpleblobdetector
to:
* Cette fonction implémente la fonction native openCV simpleblobdetector. Voir : http://opencv.itseez.com/modules/features2d/doc/common_interfaces_of_feature_detectors.html#simpleblobdetector
Added lines 215-220:

(:sourcend:)

!! Exemple webcam

(:source lang=processing:)
Changed line 53 from:
* %blue% En pratique, pour une prise en compte optimale des blobs significatifs uniquement, on aura intérêt à combiner par exemple la détection selon l'aire ET la circularité par exemple. %blue%
to:
* %blue% En pratique, pour une prise en compte optimale des blobs significatifs uniquement, on aura intérêt à combiner par exemple la détection selon l'aire ET la circularité. %blue%
Changed line 24 from:
* L'utilisation de cette fonction ne dispense pas d'un pré-traitement de l'image afin d'obtenir l'extraction des Blobs, notamment avec la fonction mixerRGBGray().
to:
* %red%'''L'utilisation de cette fonction ne dispense pas d'un pré-traitement de l'image''' afin d'obtenir une extraction optimale des Blobs souhaités, notamment avec la fonction mixerRGBGray() dans le cas d'objet coloré.%%
Changed line 53 from:
* %blue% En pratique, on aura intérêt à combiner par exemple la détection selon l'aire ET la circularité par exemple pour obtenir une détection uniquementd'une balle colorée. %blue%
to:
* %blue% En pratique, pour une prise en compte optimale des blobs significatifs uniquement, on aura intérêt à combiner par exemple la détection selon l'aire ET la circularité par exemple. %blue%
Added line 44:
Added line 48:
Changed lines 51-53 from:


to:
>>important<<

* %blue% En pratique, on aura intérêt à combiner par exemple la détection selon l'aire ET la circularité par exemple pour obtenir une détection uniquementd'une balle colorée. %blue%
>><<
Added lines 42-47:

* En activant une sélection sur l'aire comprise entre 250 et 5000, on élimine toutes les détections aberrantes :
%center%%width=400px%[[Path:/mes_images/javacvpro/javacvpro_exemple_simple_blob_detector.png|Path:/mes_images/javacvpro/javacvpro_exemple_simple_blob_detector.png]]

* Ou bien activant une sélection sur la circularité comprise entre 0.8 et 1.2, on élimine également toutes les détections aberrantes :
%center%%width=400px%[[Path:/mes_images/javacvpro/javacvpro_exemple_simple_blob_detector.png|Path:/mes_images/javacvpro/javacvpro_exemple_simple_blob_detector.png]]
Added lines 32-46:

!! Exemple concret :

* Voici le résultat de la détection de Blobs pour un seuil entre 100 et 250 et sans autre critère de sélection :

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

* En affinant le seuil, on élimine une bonne partie des détections aberrantes :

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




Changed lines 83-92 from:
* float minThreshold, float maxThreshold, float thresholdStep, // seuil minimum, seuil maximum et pas pour la détection des blobs
* float minDistBetweenBlobs, // distance minimale entre les Blobs
* boolean filterByColor, int blobColor, // drapeau pour filtrage par couleur et couleur de filtrage en niveau de gris (0-255)
* boolean filterByArea, float minArea, float maxArea, // drapeau pour filtrage par aire et aire minimale / maximale à utiliser
* boolean filterByCircularity, float minCircularity, float maxCircularity, // drapeau pour filtrage par cirdcularité et valeur min/max
* boolean filterByConvexity, float minConvexity, float maxConvexity, // drapeau pour filtrage par convexité et valeurs min/max
* boolean filterByInertia, float minInertiaRatio, float maxInertiaRatio, // drapeau pour filtrage oar inertie
* long minRepeatability, // répétabilité
* boolean debug // drapeau d'affichage de messages
to:
* float minThreshold, float maxThreshold, float thresholdStep, : seuil minimum, seuil maximum et pas pour la détection des blobs
* float minDistBetweenBlobs, : distance minimale entre les Blobs
* boolean filterByColor, int blobColor, : drapeau pour filtrage par couleur et couleur de filtrage en niveau de gris (0-255)
* boolean filterByArea, float minArea, float maxArea, : drapeau pour filtrage par aire et aire minimale / maximale à utiliser
* boolean filterByCircularity, float minCircularity, float maxCircularity, : drapeau pour filtrage par cirdcularité et valeur min/max
* boolean filterByConvexity, float minConvexity, float maxConvexity, : drapeau pour filtrage par convexité et valeurs min/max
* boolean filterByInertia, float minInertiaRatio, float maxInertiaRatio, : drapeau pour filtrage oar inertie
* long minRepeatability, : répétabilité
* boolean debug : drapeau d'affichage de messages
Added lines 103-106:

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

Changed lines 109-115 from:

(: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 :)
to:
// Programme d'exemple de la librairie javacvPro
// par X. HINAULT - decembre 2011
// Tous droits réservés - Licence GPLv3

// Test du SimpleBlobDetector

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

PImage img;

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

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

Keypoint[] keypointsArray=null; // déclaration d'un tableau pour le stockage des points clés


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

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()); // 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
        smooth();
       
        //--- affiche image de départ ---       
        image(opencv.getBuffer(),0,0); // affiche le buffer principal OpenCV dans la fenêtre Processing
       
        //--- applicationmixer RGBgray ---
        opencv.mixerRGBGray(); // applique mixeur RGB sur le buffer principal OpenCV avec paramètres par défaut - détection couleur orange
               
        //--- affiche image finale ---
        image(opencv.getBuffer(),opencv.width(),0); // affiche le buffer principal OpenCV dans la fenêtre Processing

        //--- détection des points clés à l'aide du SimpleBlobDetector
        // le tableau de point clé va contenir les points des centres des Blobs sélectionnés ainsi que le rayon contenant
       
        //keypointsArray=opencv.keypointsSBD(opencv.Buffer, true); // forme simplifiée utilisant paramètres par défaut
       
        keypointsArray=opencv.keypointsSBD(  // forme complète SimpleBlobDetector       
          opencv.Buffer, // image ipl
          150, 250, 10, // float minThreshold, float maxThreshold, float thresholdStep,
  1, //float minDistBetweenBlobs,
    true, 255, // boolean filterByColor, int blobColor,
  true, 250,5000, // boolean filterByArea, float minArea, float maxArea,
  false, 0.8,1.2,// boolean filterByCircularity, float minCircularity, float maxCircularity,
  false,0,0, // boolean filterByConvexity, float minConvexity, float maxConvexity,
  false, 0,0, // boolean filterByInertia, float minInertiaRatio, float maxInertiaRatio,
  2,// long minRepeatability,
          true // debug         
          ); // fin keypointsSBD
       
        //--- dessin des points clés à partir du tableau de points clés
       
        //opencv.drawKeypoints(keypointsArray, true); // forme simplifiée utilisant paramètres par défaut
       
        opencv.drawKeypoints ( // forme complète fonction
keypointsArray, //Keypoint[] keypointsIn,
opencv.width(),0,1,//int xRefIn, int yRefIn, float scaleIn,
                -1, // int radius - utiliser -1 pour rayon des cercles = size des Keypoints
color(0,0,255), 1, //int colorStrokeIn, int strokeWeightIn,
true,color(0,0,255),//boolean fillIn, int colorFillIn,
true //boolean debug
); // fin draw keypoints


        noLoop();
       
}


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

}
Added lines 21-25:

>>important<<
* L'image traitée par la fonction doit être en niveau de gris.
* L'utilisation de cette fonction ne dispense pas d'un pré-traitement de l'image afin d'obtenir l'extraction des Blobs, notamment avec la fonction mixerRGBGray().
>><<
Added lines 32-36:
public Keypoint[] keypointsSBD (
opencv_core.IplImage iplImgSceneIn, 
boolean debug)

Added lines 57-69:
keypointsArray = opencv.keypointsSBD (  // la fonction keypointsSBD renvoie un tableau de Keypoint
iplImgSceneIn,  // image au format natif iplImage
minThreshold, maxThreshold, thresholdStep, // seuil minimum, seuil maximum et pas pour la détection des blobs
minDistBetweenBlobs, // distance minimale entre les Blobs
filterByColor, blobColor, // drapeau pour filtrage par couleur et couleur de filtrage en niveau de gris (0-255)
filterByArea, minArea,t maxArea, // drapeau pour filtrage par aire et aire minimale / maximale à utiliser
filterByCircularity,  minCircularity, maxCircularity, // drapeau pour filtrage par cirdcularité et valeur min/max
filterByConvexity, minConvexity, maxConvexity, // drapeau pour filtrage par convexité et valeurs min/max
filterByInertia, minInertiaRatio, maxInertiaRatio, // drapeau pour filtrage oar inertie
minRepeatability, // répétabilité
debug // drapeau d'affichage de messages
);
 
Changed lines 76-77 from:
*
to:
* keypointsArray : un tableau d'objets keypoints
* opencv_core.IplImage iplImgSceneIn,  : image au format natif iplImage
* float minThreshold, float maxThreshold, float thresholdStep, // seuil minimum, seuil maximum et pas pour la détection des blobs
* float minDistBetweenBlobs, // distance minimale entre les Blobs
* boolean filterByColor, int blobColor, // drapeau pour filtrage par couleur et couleur de filtrage en niveau de gris (0-255)
* boolean filterByArea, float minArea, float maxArea, // drapeau pour filtrage par aire et aire minimale / maximale à utiliser
* boolean filterByCircularity, float minCircularity, float maxCircularity, // drapeau pour filtrage par cirdcularité et valeur min/max
* boolean filterByConvexity, float minConvexity, float maxConvexity, // drapeau pour filtrage par convexité et valeurs min/max
* boolean filterByInertia, float minInertiaRatio, float maxInertiaRatio, // drapeau pour filtrage oar inertie
* long minRepeatability, // répétabilité
* boolean debug // drapeau d'affichage de messages

Changed lines 90-94 from:
Aucune

!! Utilisation
type

*
to:
Un tableau d'objet Keypoints correspondant aux blobs sélectionnés. Chaque Keypoint se caractérise par ses coordonnées, un angle, une taille et un octave.

!!Utilisation
type

* Filtrer des Blobs afin d'écarter les Blobs indésirables.
Changed line 13 from:
* Cette fonction permet de sélectionner des Blobs (formes) à partir d'une image en niveaux de gris sur plusieurs critères différents :
to:
* Cette fonction permet de sélectionner des Blobs (formes) grâce à l'algorithme natif openCV "Simple Blob Detector" à partir d'une image en niveaux de gris. La sélection peut se faire sur tout ou partie de plusieurs critères différents :
Changed line 16 from:
** la circularité
to:
** la circularité (proximité de la forme avec le cercle)
Added lines 31-44:

public Keypoint[] keypointsSBD (  // la fonction keypointsSBD renvoie un tableau de Keypoint
opencv_core.IplImage iplImgSceneIn,  // image au format natif iplImage
float minThreshold, float maxThreshold, float thresholdStep, // seuil minimum, seuil maximum et pas pour la détection des blobs
float minDistBetweenBlobs, // distance minimale entre les Blobs
boolean filterByColor, int blobColor, // drapeau pour filtrage par couleur et couleur de filtrage en niveau de gris (0-255)
boolean filterByArea, float minArea, float maxArea, // drapeau pour filtrage par aire et aire minimale / maximale à utiliser
boolean filterByCircularity, float minCircularity, float maxCircularity, // drapeau pour filtrage par cirdcularité et valeur min/max
boolean filterByConvexity, float minConvexity, float maxConvexity, // drapeau pour filtrage par convexité et valeurs min/max
boolean filterByInertia, float minInertiaRatio, float maxInertiaRatio, // drapeau pour filtrage oar inertie
long minRepeatability, // répétabilité
boolean debug // drapeau d'affichage de messages
)

Added lines 1-80:
(:notitle:)
(:include HautPageReference:)\\
[[Main.LibrairieJavacvPro|Librairie JavacvPro]]

! Classe OpenCV : keypointsSBD()
----

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


!! Description

* Cette fonction permet de sélectionner des Blobs (formes) à partir d'une image en niveaux de gris sur plusieurs critères différents :
** le niveau de niveau de gris à prendre en compte
** l'aire
** la circularité
** la rapport de l'inertie minimale / inertie maximale
** la convexité

* Cette fonction assure la détection des Blobs en interne : les Blobs n'ont pas besoin d'être détectés au préalable.

* Cette fonction implémente la fonction native openCv . Voir : http://opencv.itseez.com/modules/features2d/doc/common_interfaces_of_feature_detectors.html#simpleblobdetector

* La fonction renvoie un tableau de Keypoint caractérisé chacun par les coordonnées du point, une taille, un octave et un angle.

* Voir également : selectBlobs(),selectBallBlobs()

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


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