View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS


Librairie JavacvPro

Classe OpenCV : selectBlobs()


Description

  • Cette fonction permet de réaliser une sélection de certaines formes au sein d'un tableau de Blob renvoyé par la fonction blobs(). La fonction selectBlobs() renvoie également un tableau des Blob sélectionnés.
  • Cette fonction peut réaliser d'une part un test du ratio hauteur/largeur du rectangle entourant la forme, afin par exemple de sélectionner uniquement les formes tenant dans un carré (ce qui est le cas d'une balle par exemple).
  • Cette fonction peut réaliser d'autre part un test du ratio (aire de la forme / aire du rectangle contenant) afin de ne sélectionner que les formes occupant suffisamment de surface au sein du rectangle entourant. Ceci sera utile par exemple pour détecter une balle qui devra occuper au moins 60% de la surface du rectangle entourant (cf (aire du cercle / aire du carré entourant) ).
  • Les 2 tests peuvent être réalisés simultanément réalisant un test de cohérence de la forme détectée. Ceci pourra être mis à profit pour détecter les formes dont on s'attend à certaines caractéristiques géométriques simples, éliminant ainsi les formes non souhaitées.
  • Voir également :

Déclaration source java

public Blob[] selectBlobs(Blob[] blobsIn, boolean hwTestIn, float ratioWHTest, float delta, boolean areaTestIn, float areaRatioTest, boolean modeIn, boolean debugIn)

Syntaxe

opencv.selectBlobs(blobsArray, hwTest, ratioWHTest, ratioHWTest, areaTest, areaRatioTest, mode, debug)

Paramètres

  • opencv : un objet OpenCV déclaré avec le constructeur OpenCV.
  • blobsArray : le tableau de Blob à tester, typiquement issu de la fonction blobs()
  • hwTestIn : le drapeau d'activation du test h/w - Actif si true, inactif si false
  • ratioWHTest : valeur de référence pour le ratio w/h
  • delta : valeur de variation acceptable pour le ratio, en %
  • areaTest : le drapeau d'activation du test aire Blob / aire Rect
  • areaRatio : valeur de référence pour le ratio aire Blob / aire Rect
  • mode : drapeau fixant le test à réaliser - "si les conditions sont vraies" si true - "si les conditions sont fausses" si false
  • debugIn : drapeau d'activation des messages de debug de la fonction

Valeur renvoyée

  • Le tableau d'objets Blob répondant aux critères.

Utilisation type

  • Sélectionner uniquement les formes cohérentes et éliminer les formes aléatoires détectées par erreur.

Exemple


blobsArray=opencv.selectBlobs(blobsArray, true, 3, 10, true, 0.2, true, true); // sélectionne que les rectangles ratio W/H=3+/-10% ayant au moins 20% surface occupée
blobsArray=opencv.selectBlobs(blobsArray, true, 1, 20, true, 0.6, true, true); // sélectionne que proche carré (ratio W/H = 1 +/- 20%) avec 60% surface occupée = balles

 

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/selectblobs.png"; // 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

        //--- application d'un seuillage binaire ---
        opencv.threshold(0.6, "BINARY"); // seuillage binaire pour éliminer le fond
        // NB : le seuil est mis ici volontairement bas pour augmenter le nombre de fausses détections
        image(opencv.getBuffer(),opencv.width(),0); // 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()/512, 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

        //--- affichage des Blobs avant sélection ---  

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

        //-- dessin du rectangle autour du tracé de la forme --
        opencv.drawRectBlobs(blobsArray,0,opencv.height(),1); // trace rectangle en se basant sur point référence et avec les paramètres

        //-- dessin du pourtour du blob sur l'image de départ --
        opencv.drawBlobs(blobsArray,0,opencv.height(),1 ); // trace les formes du tableau de Blobs en se basant sur point référence + paramètre par défaut

        //-- dessin du centre du blob sur le tracé de la forme --
        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


        //--- sélection des Blob cohérents ---
        //blobsArray=opencv.selectBlobs(blobsArray, hwTest, ratioWHTest, delta, areaTest, areaRatioTest, mode, debug);

        blobsArray=opencv.selectBlobs(blobsArray, true, 6, 20, true, 0.2, true, true); // sélectionne que les rectangles ratio W/H=6+/-10% ayant au moins 20% surface occupée
        //blobsArray=opencv.selectBlobs(blobsArray, true, 1, 20, true, 0.6, true, true); // sélectionne que proche carré (ratio W/H = 1 +/- 20%) avec 60% surface occupée = balles


        //blobsArray=opencv.selectBallBlobs(blobsArray); // sélectionne uniquement les Blobs pouvant correspondre à 1 balle

        //-- 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 selectBlobs - 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()/4000, 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

        //-- dessin du rectangle autour du tracé de la forme avant sélection --
        //opencv.drawRectBlobs (blobsArray, xRef, yRef, scale, colorStroke, strokeWeight, fill, colorFill)
        opencv.drawRectBlobs(blobsArray,0,opencv.height(),1, color(255,0,255),1,false,0); // trace le rectangle avec les paramètres

        //--- sélection des Blob cohérents ---
        //--- sélection des Blob cohérents ---
        //blobsArray=opencv.selectBlobs(blobsArray, hwTest, ratioWHTest, delta, areaTest, areaRatioTest, mode, debug);

        blobsArray=opencv.selectBlobs(blobsArray, true, 6, 20, true, 0.2, true, true); // sélectionne que les rectangles ratio W/H=6+/-10% ayant au moins 20% surface occupée
        //blobsArray=opencv.selectBlobs(blobsArray, true, 1, 20, true, 0.6, true, true); // sélectionne que proche carré (ratio W/H = 1 +/- 20%) avec 60% surface occupée = balles


        //blobsArray=opencv.selectBallBlobs(blobsArray); // sélectionne uniquement les Blobs pouvant correspondre à 1 balle

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

 

Commentaires utilisateurs

Aucun

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