OpencvdrawConvexityDefects Main.OpencvdrawConvexityDefects HistoryHide minor edits - Show changes to output Added lines 171-177:
>>important<< %blue%'''Usage type''' :%% * cibler la webcam vers un fond relativement uni, * mémoriser le fond par un appui sur ESPACE * puis mettre la main ou un objet dans le champ de la webcam : les points de convexités seront tracés. >><< Added lines 179-428:
// Programme processing // généré avec le générateur de code Processing // du site www.mon-club-elec.fr // par X. HINAULT - tous droits réservés // Programme écrit le : 6/11/2011. MAJ : Mars 2012 // ------- Licence du code de ce programme : GPL v3----- // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. /////////////// Description du programme //////////// // Utilise le clavier // Utilise la librairie GSVideo de capture et lecture vidéo // Utilise la librairie javacvPro de traitement d'image et reconnaissance visuelle /* Soustraction du fond par différence absolue pixel par pixel sur un flux vidéo Détection de la forme de la main Détection des points de convexité et des "creux" significatifs (convexityDefect) */ // XXXXXXXXXXXXXXXXXXXXXX ENTETE DECLARATIVE XXXXXXXXXXXXXXXXXXXXXX // inclusion des librairies utilisé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/ // et ici : http://codeanticode.wordpress.com/2011/05/16/gsvideo-09-release import monclubelec.javacvPro.*; // importe la librairie javacvPro qui implémente le traitement d'image avancé et la reconnaissance visuelle pour Processing // cette librairie se base sur les fonctions java de la librairie javacv par Samuel Audet : http://code.google.com/p/javacv/ // javacv implémente en Java les centaines de fonctions natives de la librairie OpenCV (2500 algorithmes) ! // la librairie javacvPro doit être présente dans le répertoire modes/java/libraries du répertoire Processing (1-5) // dispo ici : http://www.mon-club-elec.fr/pmwiki_reference_lib_javacvPro/pmwiki.php // nécessite également que la librairie native OpenCV 2.3.1 soit installée sur votre ordinateur // NB : compatibilité avec la plupart des fonctions de la librairie OpenCV pour Processing : http://ubaa.net/shared/processing/opencv/ // déclaration objets PImage imgSrc, imgDest; // déclare un/des objets PImage (conteneur d'image Processing) 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 Blob[] blobsArray=null; // tableau pour la détection des blobs (contour de forme) ConvexityDefect[] cdArray=null; // tableau pour le stockage de convexity defect // déclaration variables globales //------ déclaration des variables de couleur utiles ---- int jaune=color(255,255,0); int vert=color(0,255,0); int rouge=color(255,0,0); int bleu=color(0,0,255); int noir=color(0,0,0); int blanc=color(255,255,255); int bleuclair=color(0,255,255); int violet=color(255,0,255); // variable pour la taille de la capture video int widthCapture=320; // largeur capture int heightCapture=240; // hauteur capture int fpsCapture=20; // framerate (image/secondes) pour la capture video long millis0=0; // variable de mémorisation de millis // XXXXXXXXXXXXXXXXXXXXXX Fonction SETUP XXXXXXXXXXXXXXXXXXXXXX void setup(){ // fonction d'initialisation exécutée 1 fois au démarrage // ---- initialisation paramètres graphiques utilisés colorMode(RGB, 255,255,255); // fixe format couleur R G B pour fill, stroke, etc... fill(0,0,255); // couleur remplissage RGB - noFill() si pas de remplissage stroke (0,0,255); // couleur pourtour RGB - noStroke() si pas de pourtour rectMode(CORNER); // origine rectangle : CORNER = coin sup gauche | CENTER : centre imageMode(CORNER); // origine image : CORNER = coin sup gauche | CENTER : centre ellipseMode(CENTER); // origine cercles / ellipses : CENTER : centre (autres : RADIUS, CORNERS, CORNER //strokeWeight(0); // largeur pourtour frameRate(30);// Images par seconde - The default rate is 60 frames per second // --- initialisation fenêtre de base --- size(widthCapture*2,heightCapture*2); // ouvre une fenêtre xpixels x ypixels background(0,0,0); // couleur fond fenetre // --- initialisation des objets et fonctionnalités utilisées --- //======== Initialisation Objets GSVideo (capture et/ou lecture video ========= //GSCapture(this, int requestWidth, int requestHeight, [String sourceName], [String cameraName], [int frameRate]) cam = new GSCapture(this, widthCapture, heightCapture); // forme simplifiée //cam = new GSCapture(this, widthCapture, heightCapture,"v4l2src","/dev/video1",fpsCapture); // 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 cam.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 les buffers image de la taille voulue println("Appuyer sur ESPACE pour mémoriser le fond."); } // fin fonction Setup // XXXXXXXXXXXXXXXXXXXXXX Fonction Draw XXXXXXXXXXXXXXXXXXXX void draw() { // fonction exécutée en boucle // Code type capture GSVideo - utilisation possible aussi de captureEvent() if (cam.available() == true) { // si une nouvelle frame est disponible sur la webcam cam.read(); // acquisition d'un frame imgSrc=cam.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 millis0=millis(); // mémorise millis() opencv.blur(); // +/- effet flou préalable // +/- application de la différence absolue sur un seul canal couleur //opencv.extractRGB(); // extrait les 3 canaux couleur du buffer principal //opencv.copyTo(opencv.BufferB,opencv.Buffer); // copie le buffer couleur dans le buffer principal image(opencv.image(), 0, 0); // affiche buffer principal //image(opencv.getBufferB(), 0, 0); // affiche buffer couleur // --- réalise différence absolue -- opencv.absDiff(); // réalise soustraction entre Buffer et Memory et met le résultat dans Memory2 image(opencv.getMemory2(),0,heightCapture); // affiche image résultante stockée dans le mémory 2 //--- opération sur le buffer Memory 2 //opencv.gray("MEMORY2"); // transforme en niveaux de gris le buffer MEMORY2 //opencv.multiply(opencv.Memory2,4); opencv.threshold(opencv.Memory2, 0.2, "BINARY"); // applique seuillage sur image - méthodes disponibles : BINARY, BINARY_INV, TRUNC, TOZERO, TOZERO_INV //-- le niveau de seuil est important-- //opencv.invert("MEMORY2"); // inverse l'image du buffer MEMORY2 image(opencv.getMemory2(),widthCapture,heightCapture); // affiche image résultante stockée dans le mémory 2 //--- détection des Blobs --- blobsArray=opencv.blobs(opencv.Memory2, opencv.area()/64,opencv.area(),20, true, 10000, true); // applique blobs à l'objet IplImage avec paramètres et renvoie tableau d'objets Blob //-- dessin du rectangle autour du tracé de la forme -- opencv.drawRectBlobs(blobsArray,opencv.width(),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,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 //-- 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 //--- dessin des points de convexité --- //opencv.drawConvexPoints(blobsArray, xRef, yRef, scale, radius,colorStroke, strokeWeight, fill, colorFill, debug); //opencv.drawConvexPoints(blobsArray, opencv.width(),opencv.height(),1, 5,color(0,255,0), 2, false, 0, true); //--- dessin des points des "zones de creux" (Convexity Defect) --- //opencv.drawConvexityDefect(blobsArray, xRef, yRef, scale, radius,colorStroke, strokeWeight, fill, colorFill, minDepth, debug); //opencv.drawConvexityDefect(blobsArray, opencv.width(),opencv.height(),1, 10,color(255,0,255), 2, false, 0, 20, true); //--- tracé des "ConvexityDefect" sur l'image de départ --- //opencv.drawConvexityDefect(blobsArray, 0,0,1, 10,color(255,0,255), 2, false, 0, 20, true); for (int i=0; i<blobsArray.length; i++) { // passe en revue les blobs // Sélectionne les objets ConvexityDefect utiles // ConvexityDefect[] convexityDefects(Blob blobIn, float minDepthIn, float angleMaxIn, boolean debugIn) cdArray=opencv.convexityDefects(blobsArray[i], (float)20, radians(110), true); //--- dessine le tableau de ConvexityDefect //drawConvexityDefects(ConvexityDefect[] cdArrayIn, int xRefIn, int yRefIn, float scaleIn, int radius, int colorStrokeIn, int strokeWeightIn, boolean fillIn, int colorFillIn, boolean lineIn, int colorStrokeLineIn, int strokeWeightLineIn, int mode, boolean debugIn ) opencv.drawConvexityDefects(cdArray, opencv.width(),opencv.height(),1.0, 10,color(0,255,255), 2, false, 0, true, color(0,0,255), 2, 1, false ); }// fin for i - défile blobs println("Durée traitement image OpenCV=" + (millis()-millis0)+"ms."); } // fin if available // while(true); // stoppe boucle draw } // fin de la fonction draw() // XXXXXXXXXXXXXXXXXXXXXX Autres Fonctions XXXXXXXXXXXXXXXXXXXXXX //------------ gestion évènement clavier --------- void keyPressed() { // si une touche est appuyée if(key==' ') { // si touche enfoncee opencv.remember(); // mémorise le Buffer dans le buffer Memory image(opencv.getMemory(),widthCapture,0); // affiche l'image présente dans le buffer Memory } // fin si touche enfoncee } //--- fin si touche enfoncee //------------- Fonction d'arret de Processing ---- public void stop(){ // fonction d'arrêt de Processing cam.delete(); // efface l'objet GScapture super.stop(); // obligatoire } // fin fonction stop() //XXXXXXXXXXXXXXXXXX Fin du programme XXXXXXXXXXXXXXXXX Added lines 169-173:
!! Exemple webcam (:source lang=processing:) (:sourcend:) Added lines 150-151:
//opencv.drawConvexityDefects(cdArray); //opencv.drawConvexityDefects(cdArray, opencv.width(),opencv.height(),1.0); Added line 165:
Changed lines 13-14 from:
* Cette fonction to:
* Cette fonction trace les objets d'un tableau de ConvexityDefect obtenu avec la fonction convexityDefects. * Cette fonction est à distinguer de la fonction drawConvexityDefect() qui trace tous les creux sans distinction. Changed line 5 from:
! Classe OpenCV : to:
! Classe OpenCV : drawConvexityDefects() Changed lines 16-17 from:
* Voir également : blobs(), convexityDefects(), to:
* Voir également : blobs(), convexityDefects(), detectFinger() Changed lines 21-23 from:
to:
public void drawConvexityDefect(Blob[] blobsIn) public void drawConvexityDefect(Blob[] blobsIn, int xRefIn, int yRefIn, float scaleIn) public void drawConvexityDefects(ConvexityDefect[] cdArrayIn, int xRefIn, int yRefIn, float scaleIn, int radius, int colorStrokeIn, int strokeWeightIn, boolean fillIn, int colorFillIn, boolean lineIn, int colorStrokeLineIn, int strokeWeightLineIn, int modeLineIn, boolean debugIn ) Changed lines 29-31 from:
to:
opencv.drawConvexityDefects(cdArray); opencv.drawConvexityDefects(cdArray, xRef, yRef, scale); opencv.drawConvexityDefects(cdArray, xRef, yRef, scale, radius, colorStroke, strokeWeight, fill, colorFill, line, colorStrokeLine, strokeWeightLine, modeLine, debug ); Changed lines 39-51 from:
to:
* xRef, yRef : lescoordonnées du point de référence du tracé * scale : l'échelle du tracé. Utiliser 1 par défaut. * radius : le rayon des cercles des points * colorStroke : couleur du contour des points * strokeWeight : épaisseur du contour des points * fill : drapeau de remplissage des cercles - rempli si true * colorFill : couleur de remplissage * line : drapeau de dessin des lignes - dessinées si true * colorStrokeLine : couleur de dessin des lignes * strokeWeightLine : épaisseur de dessin des lignes * modeLine : mode de dessin des lignes. =0 : dessine que le segment Start - End, =1 : dessine les 3 segments * debug : drapeau de message de debug. message si true. Changed line 54 from:
* to:
* Aucune. Deleted lines 34-45:
* scale : échelle du dessin. Mettre à 1. * radius : rayon des points * colorStroke : couleur contour points * strokeWeight : largeur trait contour point * fill : drapeau remplissage point - remplit si true * colorFill : couleur remplissage points * line : drapeau pour activation du tracé des lignes - trace les lignes si true * colorStrokeLine : couleur de tracé des lignes * strokeWeightLine : largeur de tracé des lignes * modeLine : fixe la façon de dessiner les lignes. 0 pour dessiner que Start-End, 1 pour dessiner les 3 côtés. * debug : drapeau de debug- affiche message si true Changed line 5 from:
! Classe OpenCV : to:
! Classe OpenCV : detectFinger() Changed lines 13-18 from:
* Cette fonction permet * Cette fonction est à distinguer de * Voir également : blobs(), convexityDefects to:
* Cette fonction (expérimentale) permet d'analyser les objets d'un tableau de ConvexityDefect préalablement sélectionnés avec la fonction convexityDefects() et renvoie une valeur numérique correspondant à la position correspondante des doigts. * Voir également : blobs(), convexityDefects(), drawConvexityDefects() Changed lines 21-23 from:
public void drawConvexityDefects(ConvexityDefect[] cdArrayIn, int xRefIn, int yRefIn, float scaleIn) public void drawConvexityDefects(ConvexityDefect[] cdArrayIn, int xRefIn, int yRefIn, float scaleIn, int radius, int colorStrokeIn, int strokeWeightIn, boolean fillIn, int colorFillIn, boolean lineIn, int colorStrokeLineIn, int strokeWeightLineIn, int modeLineIn, boolean debugIn ) to:
Changed lines 27-29 from:
opencv.drawConvexityDefects(cdArray,xRef, yRef, scale); opencv.drawConvexityDefects(cdArray,xRef, yRef, scale, radius, colorStroke, strokeWeight,fill, colorFill, line, colorStrokeLine, strokeWeightLine, modeLine, debug ) to:
Changed line 50 from:
* modeLine : fixe la façon de dessiner les lignes. to:
* modeLine : fixe la façon de dessiner les lignes. 0 pour dessiner que Start-End, 1 pour dessiner les 3 côtés. Added lines 22-23:
public void drawConvexityDefects(ConvexityDefect[] cdArrayIn) public void drawConvexityDefects(ConvexityDefect[] cdArrayIn, int xRefIn, int yRefIn, float scaleIn) Added lines 30-31:
opencv.drawConvexityDefects(cdArray); opencv.drawConvexityDefects(cdArray,xRef, yRef, scale); Added lines 1-173:
(:notitle:) (:include HautPageReference:)\\ [[Main.LibrairieJavacvPro|Librairie JavacvPro]] ! Classe OpenCV : convexityDefects() ---- %center%%width=400px%[[Path:/mes_images/javacvpro/javacvpro_exemple_convexityDefects.png|Path:/mes_images/javacvpro/javacvpro_exemple_convexityDefects.png]] !! Description * Cette fonction permet de dessiner les objets d'un tableau de ConvexityDefect préalablement sélectionnés avec la fonction convexityDefects(). * Cette fonction est à distinguer de la fonction drawConvexityDefect() qui trace tous les creux sans renvoyer d'objets ConvexityDefect. * Voir également : blobs(), convexityDefects() !! Déclaration source java (:source lang=java :) public void drawConvexityDefects(ConvexityDefect[] cdArrayIn, int xRefIn, int yRefIn, float scaleIn, int radius, int colorStrokeIn, int strokeWeightIn, boolean fillIn, int colorFillIn, boolean lineIn, int colorStrokeLineIn, int strokeWeightLineIn, int modeLineIn, boolean debugIn ) (:sourcend:) !! Syntaxe (:source lang=processing :) opencv.drawConvexityDefects(cdArray,xRef, yRef, scale, radius, colorStroke, strokeWeight,fill, colorFill, line, colorStrokeLine, strokeWeightLine, modeLine, debug ) (:sourcend:) !! Paramètres * opencv : un objet OpenCV déclaré avec le constructeur [[OpencvOpencv|OpenCV]]. * cdArray : tableau d'objets ConvexityDefect * xRef, yRef : coordonnées à utiliser pour le coin sup gauche du dessin. * scale : échelle du dessin. Mettre à 1. * radius : rayon des points * colorStroke : couleur contour points * strokeWeight : largeur trait contour point * fill : drapeau remplissage point - remplit si true * colorFill : couleur remplissage points * line : drapeau pour activation du tracé des lignes - trace les lignes si true * colorStrokeLine : couleur de tracé des lignes * strokeWeightLine : largeur de tracé des lignes * modeLine : fixe la façon de dessiner les lignes. Laisser à 0. * debug : drapeau de debug- affiche message si true !! Valeur renvoyée * Aucune !! Utilisation type * Détection des doigts de la main. !! Exemple %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 :) // Programme d'exemple de la librairie javacvPro // par X. HINAULT - octobre 2011 // Tous droits réservés - Licence GPLv3 // Exemple fonction convexityDefects() et drawConvexityDefects() import monclubelec.javacvPro.*; // importe la librairie javacvPro PImage img; String url="http://www.mon-club-elec.fr/mes_images/online/fond.png"; // String contenant l'adresse internet de l'image à utiliser String url2="http://www.mon-club-elec.fr/mes_images/online/fond_main.png"; // String contenant l'adresse internet de l'image à utiliser OpenCV opencv; // déclare un objet OpenCV principal Blob[] blobsArray=null; // tableau pour la détection des blobs (contour de forme) ConvexityDefect[] cdArray=null; // tableau pour le stockage de convexity defect void setup(){ // fonction d'initialisation exécutée 1 fois au démarrage //-- charge image utilisée = le fond --- img=loadImage(url); // 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 opencv.remember(); // conserve le buffer dans le buffer Memory //--- 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.getMemory(),0,0); // affiche le buffer Memory OpenCV dans la fenêtre Processing //-- charge image utilisée = le fond + objet --- img=loadImage(url2); // crée un PImage contenant le fichier à partir adresse web opencv.copy(img); // charge le PImage dans le buffer OpenCV image(opencv.getBuffer(),opencv.width(),0); // affiche le buffer principal OpenCV dans la fenêtre Processing //--- application de la fonction absDiff opencv.absDiff(); // réalise soustraction Memory et Buffer principal - résultat mis dans Memory 2 image(opencv.getMemory2(),0,opencv.height()); // affiche le buffer principal OpenCV dans la fenêtre Processing //--- application d'un seuillage binaire pour isoler objet détecté --- //opencv.gray(opencv.Memory2); // pas indispensable - la fonction threshold transforme en niveau de gris l'image avant seuillage opencv.threshold(opencv.Memory2,0.15, "BINARY"); // seuillage binaire pour éliminer le fond - valeur seuil basse possible car fond éliminé image(opencv.getMemory2(),opencv.width(),opencv.height()); // affiche le buffer Memory2 OpenCV dans la fenêtre Processing //--- détection des Blobs --- blobsArray=opencv.blobs(opencv.Memory2, opencv.area()/64,opencv.area(),20, true, 1000, true); // applique blobs à l'objet IplImage avec paramètres et renvoie tableau d'objets Blob //-- dessin du rectangle autour du tracé de la forme -- opencv.drawRectBlobs(blobsArray,opencv.width(),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,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 //-- 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 //--- dessin des points des "zones de creux" (Convexity Defect) --- //opencv.drawConvexityDefect(blobsArray, xRef, yRef, scale, radius,colorStroke, strokeWeight, fill, colorFill, minDepth, debug); //opencv.drawConvexityDefect(blobsArray, opencv.width(),opencv.height(),1, 10,color(255,0,255), 2, false, 0, 20, true); for (int i=0; i<blobsArray.length; i++) { // passe en revue les blobs // Sélectionne les objets ConvexityDefect utiles // ConvexityDefect[] convexityDefects(Blob blobIn, float minDepthIn, float angleMaxIn, boolean debugIn) cdArray=opencv.convexityDefects(blobsArray[i], (float)20, radians(110), true); //--- dessine le tableau de ConvexityDefect //drawConvexityDefects(ConvexityDefect[] cdArrayIn, int xRefIn, int yRefIn, float scaleIn, int radius, int colorStrokeIn, int strokeWeightIn, boolean fillIn, int colorFillIn, boolean lineIn, int colorStrokeLineIn, int strokeWeightLineIn, int mode, boolean debugIn ) opencv.drawConvexityDefects(cdArray, opencv.width(),opencv.height(),1.0, 10,color(0,255,255), 2, false, 0, true, color(0,0,255), 2, 1, false ); }// fin for i - défile blobs noLoop(); // stop programme } void draw() { // fonction exécutée en boucle } (: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 |