View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS


Librairie JavacvPro

Classe OpenCV : keypointsSBD()


Description

  • 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 :
    • le niveau de niveau de gris à prendre en compte
    • l'aire
    • la circularité (proximité de la forme avec le cercle)
    • 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.
  • 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 une extraction optimale des Blobs souhaités, notamment avec la fonction mixerRGBGray() dans le cas d'objet coloré.

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 :
  • En affinant le seuil, on élimine une bonne partie des détections aberrantes :
  • En activant une sélection sur l'aire comprise entre 250 et 5000, on élimine toutes les détections aberrantes :
  • Ou bien activant une sélection sur la circularité comprise entre 0.8 et 1.2, on élimine également toutes les détections aberrantes :
  • 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é.

Déclaration source java


public Keypoint[] keypointsSBD (
opencv_core.IplImage iplImgSceneIn,  
boolean debug)


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
)

 

Syntaxe


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

Paramètres

  • opencv : un objet OpenCV déclaré avec le constructeur OpenCV.
  • 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

Valeur renvoyée

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.

Exemple

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

}

 

Exemple webcam



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

Commentaires utilisateurs

Aucun

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