View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS


Librairie JavacvPro | Strategies

Stratégies : Suivi d'objet coloré (Tracking) : Détection et tracé des formes.


Explication

Voir également :

Remarques techniques

  • La fonction de détection des formes permet de filtrer d'emblée les formes à prendre en compte en précisant la taille minimale que doivent faire les formes à retenir.
  • A noter qu'en cas de détection d'artefacts, ceux-ci pourront être éliminés secondairement par analyse géométrique.

Fonction javacvPro utilisées :

Code d'exemple


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

// Exemple utilisation de la capture d'un flux video avec JavacvPro et GSVideo
// et filtrage couleur - ici balle orange


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/
// et ici : http://codeanticode.wordpress.com/2011/05/16/gsvideo-09-release

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

GSCapture cam1; // 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

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

PImage imgSrc;

int widthCapture=320;
int heightCapture=240;
int fpsCapture=20;

void setup(){ // fonction d'initialisation exécutée 1 fois au démarrage

        size(widthCapture*2,heightCapture*2);

        //======== Initialisation Objets GSVideo (capture et/ou lecture video =========

        // GSCapture(this, int requestWidth, int requestHeight, [int frameRate], [String sourceName], [String cameraName])
        cam1 = new GSCapture(this, widthCapture, heightCapture,fpsCapture,"v4l2src","/dev/video0"); // Initialise objet GSCapture désignant webcam
        // largeur et hauteur doivent être compatible avec la webcam - typiquement 160x120 ou 320x240 ou 640x480...
        // Meilleurs résultats avec framerate webcam entre 20 et 30 et frameRate programme idem ou multiple plus grand (40 pour 20 par ex)
        // la liste des webcam installées sous Ubuntu (Gnu/Linux) est donnée par la commande : ls /dev/video*

        // cam1.play();  // démarre objet GSCapture = la webcam - version GSVideo avant 0.9
        cam1.start();  // démarre objet GSCapture = la webcam - version GSVideo après 0.9

        //======== Initialisation Objets OpenCV (librairie javacvPro : traitement d'image et reconnaissance visuelle) =========

        opencv = new OpenCV(this); // initialise objet OpenCV à partir du parent This
        opencv.allocate(widthCapture,heightCapture); // crée le buffer image de la taille voulue



}


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

  if (cam1.available() == true) { // si une nouvelle frame est disponible sur la webcam
    cam1.read(); // acquisition d'un frame

    imgSrc=cam1.get(); // récupère l'image GS video dans Pimage
    opencv.copy(imgSrc); // charge l'image dans le buffer openCV

    //opencv.copy(cam1.get()); // autre possibilité - charge directement l'image GSVideo dans le buffer openCV

    image(opencv.getBuffer(),0,0); // affiche flux vidéo direct depuis OpenCV

    //--- opérations sur image courante ---

        //--- application du filtre mixerRGBGray() = filtrage couleur
        //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.7, "BINARY"); // seuillage binaire pour éliminer le fond  - coefficient fonction de la luminosité ambiante
        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(), 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(imgSrc,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

        // tracé sur l'image de départ
        opencv.drawRectBlobs(blobsArray,0,0,1, color(255,0,0), 1, 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,3, color(0,255,0), 1, false, 0); // trace le centre des Blob en fonction paramètres

        // tracé sur l'image de départ
        opencv.drawCentroidBlobs (blobsArray,0,0,1,5, color(255,0,0), 1, true, color(255,0,0)); // trace le centre des Blob en fonction paramètres


  } // fin if cam1 available

} // fin fonction draw