View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS


Librairie JavacvPro

Classe OpenCV : blobs()


Description

  • Cette fonction détecte les formes dans une image et renvoie un tableau d'objets de la classe Blob correspondant aux formes détectées dans l'image analysée. L'objet Blob renvoyé pour chaque forme fournit un certain nombre de paramètres (voir ci-dessous) et le tableau des coordonnées (x,y) des points des formes détectés.
  • Cette fonction s'applique sur une image binaire (monocanal et 2 niveaux) et considère comme faisant partie d'une forme les points au niveau haut. En interne, si la fonction reçoit une image couleur RGB, elle applique au préalable la fonction gray(). La fonction est ensuite appliquée sur le buffer Gray (monocanal).
  • Si la fonction blobs est appliquée sur une image non traitée au préalable, la fonction renverra un objet Blob de la taille de l'image.
  • Cette fonction est basée sur la fonction OpenCV native cvFindContours() : http://opencv.itseez.com/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#findcontours
  • Typiquement, cette fonction est à appliquer sur une image couleur de départ qui a subi plusieurs traitement afin d'isoler les zones à détecter.
    • Par exemple, pour la recherche d'un objet coloré, on filtrera la couleur à détecter (avec la fonction mixerRGBGray() par exemple), puis on appliquera un seuillage binaire (à l'aide de la fonction threshold()) avant d'appliquer la fonction blobs().
    • Autre exemple : on pourra isoler la forme à détecter par soustraction du fond à l'aide de la fonction absDiff() suivi d'un seuillage pour binariser l'image. Ensuite, on appliquera la fonction blobs() pour détecter les contours.
  • Chaque objet Blob renvoyé par la fonction est caractérisé par les champs suivants :
    • int area : l'aire du contour
    • int lengthArc : la longueur du contour (ou périmètre
    • int length : le nombre de points du Blob
    • point centroid : le point central du contour, les coordonnées étant fournies par centroid.x et centroid.y
    • point[] points : le tableau contenant les points du contour
    • rectangle rectangle : le rectangle entourant le Blob, accessible depuis rectangle.x, rectangle.y, rectangle.width, rectangle.height
  • Voir également : drawBlobs(), drawRectBlobs(), drawCentroidBlobs(), selectBlobs, selectBallBlobs()

Comparativement à la fonction detect(), cette fonction est nettement moins gourmande en CPU et permet d'envisager un taux de traitement de 20 fps sans problème pour une image 320x240, traitement d'image préalable inclus !

Déclaration source java

public Blob[] blobs() // forme simple
public Blob[] blobs(boolean debugIn) // forme simple avec debug

public Blob[] blobs(int minAreaIn, int maxAreaIn, int maxBlobIn, boolean findHolesIn, int maxVerticesIn) // forme idem lib ubaa

public Blob[] blobs(int minAreaIn, int maxAreaIn, int maxBlobIn, boolean findHolesIn, int maxVerticesIn, boolean debug) // idem + debug
public Blob[] blobs(long minAreaIn, long maxAreaIn, int maxBlobIn, boolean findHolesIn, int maxVerticesIn, boolean debug) // idem long + debug

public Blob[] blobs(opencv_core.IplImage iplImgIn, long minAreaIn, long maxAreaIn, int maxBlobIn, boolean findHolesIn, int maxVerticesIn, boolean debug) // forme complète recevant iplImage et avec debug
 

Syntaxe

blobsArray=opencv.blobs(); // applique blobs au buffer principal avec paramètres par défaut et renvoie tableau d'objets Blob
blobsArray=opencv.blobs(debug); // applique blobs au buffer principal et renvoie tableau d'objets Blob avec debug actif
blobsArray=opencv.blobs(minArea,maxArea,maxBlob, findHoles, maxVertices, debug); // applique blobs au buffer principal avec paramètres et renvoie tableau d'objets Blob
blobsArray=opencv.blobs(imgIpl, minArea,maxArea,maxBlob, findHoles, maxVertices, debug); // applique blobs à l'objet IplImage avec paramètres et renvoie tableau d'objets Blob

Paramètres

  • opencv : un objet OpenCV déclaré avec le constructeur OpenCV.
  • blobsArray : tableau d'objets Blob, à déclarer en début de programme avec :
Blob[] blobs=null; // tableau pour la détection des blobs (contour de forme)
  • debug : drapeau d'activation des messages de debug. true : messages debug activés, false : messages debug inactivés
  • imgIpl : Objet ImageIpl ou buffer sur lequel à traiter
  • minArea : aire minimale en pixels des formes à prendre en compte. Mettre une valeur non nulle permet de ne pas prendre en compte des toutes petites formes qui sont des artéfacts. Valeur par défaut utilisée dans la forme sans paramètres : opencv.area()/256.
  • maxArea : aire maximale en pixels des formes à prendre en compte. Valeur par défaut utilisée dans la forme sans paramètres : opencv.area()/4.
  • maxBlob : nombre maximum de formes détectables. Il est utile de limiter le nombre de formes. Valeur par défaut dans la forme sans paramètres : 1000.
  • findHoles : drapeau du mode de détection à appliquer. Si false : les contours externes seulement sont pris en compte. Si true : les contours internes sont également pris en compte.
  • maxVertices : nombre maximum de segments pour un contour de forme. Par défaut pour la forme sans paramètres : 4096.

Valeur renvoyée

  • Le tableau d'objets Blob correspondant à chaque forme détectée.
  • Chaque objet Blob renvoyé par la fonction est caractérisé par les champs suivants :
    • int area : l'aire du contour
    • int lengthArc : la longueur du contour (ou périmètre
    • int length : le nombre de points du Blob
    • point centroid : le point central du contour, les coordonnées étant fournies par centroid.x et centroid.y
    • point[] points : le tableau contenant les points du contour
    • rectangle rectangle : le rectangle entourant le Blob, accessible depuis rectangle.x, rectangle.y, rectangle.width, rectangle.height

A titre d'exemple, voici comment accéder au centre d'un objet Blob appelé myBlob ici :

x=myBlob.centroid.x;
y=myBlob.centroid.y;

Utilisation type

  • Pour détecter les contours de formes isolées préalablement par traitement d'image.

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

// Exemple fonction blobs() et drawBlobs()

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;

Blob[] blobsArray=null; // tableau pour la détection des blobs (contour de forme)


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

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

        //--- application d'un seuillage binaire ---
        opencv.threshold(0.8, "BINARY"); // seuillage binaire pour éliminer le fond
        image(opencv.getBuffer(),0,opencv.height()); // affiche le buffer principal OpenCV dans la fenêtre Processing

        //-- détection de blobs ---
        //blobs=opencv.blobs(true); // blobs javacvPro avec paramètres par défaut +/- debug    

        //blobsArray=blobs(minArea,maxArea,maxBlob, findHoles, maxVertices, debug);
        blobsArray = opencv.blobs(opencv.area()/32, opencv.area()/2, 20, true, 1000, true ); // blobs javacvPro +/- debug    
        // la fonction renvoie un tableau de Blob
        // chaque Blob est caractérisé par son aire, son centre, le rectangle entourant, le tableau des points du contour
        // pour info : la fonction blobs mémorise en interne un tableau des séquences de points détectés (jusqu'à l'appel suivant de la fonction blobs() )
        // pour utilisation avec les fonctions avancées convexHull et detectDefect par exemple

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

        //-- dessin du rectangle autour du tracé de la forme --
        //opencv.drawRectBlobs (blobsArray, xRef, yRef, scale, colorStroke, strokeWeight, fill, colorFill)
        // -- toutes ces formes sont possibles
        //opencv.drawRectBlobs(blobsArray); // trace le rectangle avec les paramètres par défaut
        opencv.drawRectBlobs(blobsArray,opencv.width(),opencv.height(),1); // trace rectangle en se basant sur point référence et avec les paramètres
        //opencv.drawRectBlobs(blobsArray,opencv.width(),opencv.height(),1, color(255,0,255), 2, false, 0); // trace rectangle avec les paramètres

        //-- dessin du pourtour du blob sur l'image de départ --
        //opencv.drawBlobs (blobsArray, xRef, yRef, scale, radius, colorStroke, strokeWeight, fill, colorFill, mode);
        //-- toutes ces formes sont possibles
        //opencv.drawBlobs(blobsArray); // trace les formes du tableau de Blobs avec paramètre par défaut
        opencv.drawBlobs(blobsArray,opencv.width(),opencv.height(),1 ); // trace les formes du tableau de Blobs en se basant sur point référence + paramètre par défaut
        //opencv.drawBlobs(blobsArray,opencv.width(),opencv.height(),1,5, color(0,0,255), 1, false, 0, 0); // trace pourtour en cercles bleus

        //-- dessin du centre du blob sur le tracé de la forme --
        // opencv.drawCentroidBlobs (blobsArray, xRef, yRef, scale, radius, colorStroke, strokeWeight, fill, colorFill);
        // -- toutes ces formes sont possibles
        //opencv.drawCentroidBlobs (blobsArray); // trace le centre des Blob avec les paramètres par défaut
        opencv.drawCentroidBlobs (blobsArray,opencv.width(),opencv.height(),1); // trace le centre des Blob en se basant sur point référence + échelle et avec les paramètres par défaut
        //opencv.drawCentroidBlobs (blobsArray,opencv.width(),opencv.height(),1,10); // trace le centre des Blob en se basant sur point référence + échelle + radius et avec les paramètres par défaut
        //opencv.drawCentroidBlobs (blobsArray,opencv.width(),opencv.height(),1,5, color(0,0,255), 1, false, 0); // trace le centre des Blob en fonction paramètres


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

Blob[] blobsArray=null; // tableau pour la détection des blobs (contour de forme)

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

        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

        //--- application d'un seuillage binaire ---
        opencv.threshold(0.8, "BINARY"); // seuillage binaire pour éliminer le fond
        image(opencv.getBuffer(),0,opencv.height()); // affiche le buffer principal OpenCV dans la fenêtre Processing

        //-- détection de blobs ---
        //blobs=opencv.blobs(true); // blobs javacvPro avec paramètres par défaut +/- debug    

        //blobsArray=blobs(minArea,maxArea,maxBlob, findHoles, maxVertices, debug);
        blobsArray = opencv.blobs(opencv.area()/256, opencv.area()/2, 20, true, 1000, true ); // blobs javacvPro +/- debug    
        // la fonction renvoie un tableau de Blob
        // chaque Blob est caractérisé par son aire, son centre, le rectangle entourant, le tableau des points du contour
        // pour info : la fonction blobs mémorise en interne un tableau des séquences de points détectés (jusqu'à l'appel suivant de la fonction blobs() )
        // pour utilisation avec les fonctions avancées convexHull et detectDefect par exemple

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

        //-- dessin du rectangle autour du tracé de la forme --
        //opencv.drawRectBlobs (blobsArray, xRef, yRef, scale, colorStroke, strokeWeight, fill, colorFill)
        // -- toutes ces formes sont possibles
        //opencv.drawRectBlobs(blobsArray); // trace le rectangle avec les paramètres par défaut
        opencv.drawRectBlobs(blobsArray,opencv.width(),opencv.height(),1); // trace rectangle en se basant sur point référence et avec les paramètres
        //opencv.drawRectBlobs(blobsArray,opencv.width(),opencv.height(),1, color(255,0,255), 2, false, 0); // trace rectangle avec les paramètres

        //-- dessin du pourtour du blob sur l'image de départ --
        //opencv.drawBlobs (blobsArray, xRef, yRef, scale, radius, colorStroke, strokeWeight, fill, colorFill, mode);
        //-- toutes ces formes sont possibles
        //opencv.drawBlobs(blobsArray); // trace les formes du tableau de Blobs avec paramètre par défaut
        opencv.drawBlobs(blobsArray,opencv.width(),opencv.height(),1 ); // trace les formes du tableau de Blobs en se basant sur point référence + paramètre par défaut
        //opencv.drawBlobs(blobsArray,opencv.width(),opencv.height(),1,5, color(0,0,255), 1, false, 0, 0); // trace pourtour en cercles bleus

        //-- dessin du centre du blob sur le tracé de la forme --
        // opencv.drawCentroidBlobs (blobsArray, xRef, yRef, scale, radius, colorStroke, strokeWeight, fill, colorFill);
        // -- toutes ces formes sont possibles
        //opencv.drawCentroidBlobs (blobsArray); // trace le centre des Blob avec les paramètres par défaut
        opencv.drawCentroidBlobs (blobsArray,opencv.width(),opencv.height(),1); // trace le centre des Blob en se basant sur point référence + échelle et avec les paramètres par défaut
        //opencv.drawCentroidBlobs (blobsArray,opencv.width(),opencv.height(),1,10); // trace le centre des Blob en se basant sur point référence + échelle + radius et avec les paramètres par défaut
        //opencv.drawCentroidBlobs (blobsArray,opencv.width(),opencv.height(),1,5, color(0,0,255), 1, false, 0); // trace le centre des Blob en fonction paramètres


        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
 

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 0.77 ms en mode "interprété" soit une fréquence maximale potentielle de 120 fps.
    • de 0.77 ms en mode "compilé" soit une fréquence maximale potentielle de 120 fps.

Commentaires utilisateurs

Aucun

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