Opencvaccumulate Main.Opencvaccumulate HistoryHide minor edits - Show changes to output Changed line 103 from:
cam1 = new GSCapture(this, widthCapture, heightCapture,"v4l2src","/dev/video0",fpsCapture); // Initialise objet GSCapture désignant webcam to:
// cam1 = new GSCapture(this, widthCapture, heightCapture,"v4l2src","/dev/video0",fpsCapture); // Initialise objet GSCapture désignant webcam Added line 102:
cam1 = new GSCapture(this, widthCapture, heightCapture); // forme simplifiée Changed line 102 from:
cam1 = new GSCapture(this, widthCapture, heightCapture, to:
cam1 = new GSCapture(this, widthCapture, heightCapture,"v4l2src","/dev/video0",fpsCapture); // Initialise objet GSCapture désignant webcam Changed line 73 from:
// Montre exemple utilisation de la fonction to:
// Montre exemple utilisation de la fonction accumulate() Changed lines 59-60 from:
* to:
* Soustraction du fond et détection d'objet. Added lines 63-66:
%center%%red% L'exemple complet suivant est à copier dans Processing et est exécutable immédiatement si vous avez une webcam connectée au PC : Changed lines 69-75 from:
(:sourcend:) %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 :) to:
// Programme d'exemple de la librairie javacvPro // par X. HINAULT - novembre 2011 // Tous droits réservés - Licence GPLv3 // Montre exemple utilisation de la fonction bgsMOGInit() et bgsMOGApply() 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 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 println("Appuyez sur ESPACE pour mémoriser le fond initial !"); delay(2000); } 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.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.threshold(opencv.Memory2, 0.1, "BINARY"); // applique seuillage sur image - méthodes disponibles : BINARY, BINARY_INV, TRUNC, TOZERO, TOZERO_INV //-- le niveau de seuil est important-- //println (" Somme pixels Buffer =" +opencv.sum(opencv.Buffer) ); //println (" Somme pixels Memory2 =" +opencv.sum(opencv.Memory2) ); opencv.accumulate(opencv.Buffer, opencv.Memory,0.05, opencv.Memory2, 20,1, true); // mémorise le fond par accumulation si aucun objet détecté image(opencv.getMemory2(),widthCapture,heightCapture); // affiche image résultante stockée dans le mémory 2 } // fin if available } // fin draw 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 Changed lines 8-9 from:
%center%Path:/mes_images/javacvpro/ to:
%center%%width=400px%[[Path:/mes_images/javacvpro/javacvpro_exemple_gsvideo_accumulate.png|Path:/mes_images/javacvpro/javacvpro_exemple_gsvideo_accumulate.png]] Changed lines 14-17 from:
* Cette fonction (expérimentale) permet de moyenner et de cumuler avec un coefficient de pondération des images typiquement en provenance d'un flux vidéo dans une image "accumulateur", ce qui va moyenner toutes les images reçues. * Cette fonction reçoit par ailleurs en paramètre une valeur seuil qui stoppe l'accumulation (en cas de détection d'un objet d'avant plan) et une autre valeur seuil qui met à 0 l'accumulateur. to:
* Cette fonction ("fait-maison" et expérimentale) permet de moyenner et de cumuler avec un coefficient de pondération des images typiquement en provenance d'un flux vidéo dans une image "accumulateur", ce qui va moyenner toutes les images reçues. * Cette fonction reçoit par ailleurs en paramètre une valeur seuil qui stoppe l'accumulation (en cas de détection d'un objet d'avant plan) et une autre valeur seuil qui met à 0 l'accumulateur. Ceci a pour effet de bloquer l'atténuation lorsqu'un objet est présent, mais de maintenir l'atténuation pour les petites variations du fond (variation de luminosité) * En pratique, avec un bon paramétrage, on obtient un meilleur résultat que les algorithmes MOG pour des objets peu mobiles. Ceci permet d'obtenir une image stable de l'objet à détecter tant qu'il est présent afin d'appliquer des algorithmes de détection de contour par exemple. Added lines 45-51:
>>important<< Typiquement, on utilisera : * le buffer principal pour stocker les frames vidéos * le buffer Memory pour stocker le fond (=accumulateur) * le buffer Memory2 pour stocker la différence absolue (obtenue avec absDiff() ) entre l'image traitée et le fond >><< Added lines 1-78:
(:notitle:) (:include HautPageReference:)\\ [[Main.LibrairieJavacvPro|Librairie JavacvPro]] ! Classe OpenCV : accumulate() ---- %center%Path:/mes_images/javacvpro/bandeau_javacvpro_processing_opencv_400.png %center%%width=400px%[[Path:|Path:]] !! Description * Cette fonction (expérimentale) permet de moyenner et de cumuler avec un coefficient de pondération des images typiquement en provenance d'un flux vidéo dans une image "accumulateur", ce qui va moyenner toutes les images reçues. * Cette fonction reçoit par ailleurs en paramètre une valeur seuil qui stoppe l'accumulation (en cas de détection d'un objet d'avant plan) et une autre valeur seuil qui met à 0 l'accumulateur. * Voir également : absDiff(), bgsMOGInit(), bgsMOGApply(), bgsMOG2Init(), bgsMOG2Apply(), sum() !! Déclaration source java (:source lang=java :) public void accumulate(opencv_core.IplImage iplImgSrcIn, opencv_core.IplImage iplImgAccIn, float coeff, opencv_core.IplImage iplImgAbsDiffIn, float seuilDetectIn, float seuilRAZIn, boolean debugIn) (:sourcend:) !! Syntaxe (:source lang=processing :) opencv.accumulate(iplImgSrc, iplImgAcc, coeff, iplImgAbsDiff,seuilDetect, seuilRAZ, debug) (:sourcend:) !! Paramètres * opencv : un objet OpenCV déclaré avec le constructeur [[OpencvOpencv|OpenCV]]. * iplImgSrc : image source à ajouter à l'accumulateur * iplImgAcc : image à utiliser comme accumulateur * coeff : coefficient de pondération à appliquer à l'image source. Ce coefficient fixe la vitesse d'atténuation du fond. * iplImgAbsDiff : image correspondant à la différence absolue entre le fond et l'image source * seuilDetect : seuil de détection d'objet (en 100 000 de pixels) * seuilRAZ : seuil de RAZ de l'accumulateur (en 100 000 de pixels) * debug : drapeau pour messages de debug. Affiche messages si true, aucun message si false. !! Valeur renvoyée Aucune. L'accumulateur est modifié. !! Utilisation type * !! Exemple (:source lang=processing :) (:sourcend:) %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 :) (: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 |