View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS

Opencvsobel

Main.Opencvsobel History

Hide minor edits - Show changes to output

Changed lines 153-154 from:
// Exemple fonction canny - détection de contour style dessin au trait
to:
// Exemple fonction Sobel - détection de contour par noyau de circonvolution
Added line 245:
Added lines 147-245:


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

// Exemple fonction canny - détection de contour style dessin au trait

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;

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); // 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/video1", 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 ----------
 
        //imgSrc=cam1.get(); // récupère l'image GS video dans Pimage
        //opencv.copy(imgSrc); // charge l'image dans le buffer openCV

        millis0=millis(); // mémorise millis() 
        opencv.copy(cam.get()); // 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() 

        //-- toutes ces formes sont possibles :
        //opencv.sobel(); // applique le filtre de sobel sur le buffer principal OpenCV avec paramètres par défaut noyau = 3 et coeff=1)
        //opencv.sobel(3); //applique le filtre de sobel sur le buffer principal OpenCV avec taille noyau - coeff=1 par défaut
        opencv.sobel(3,0.8); //applique le filtre de sobel sur le buffer OpenCV désigné avec paramètres

        //opencv.sobel(opencv.Buffer,3,1); //applique le filtre de sobel sur le buffer OpenCV désigné avec paramètres

        //--- pour effet "dessin au fusain"
        opencv.gray(); // passage en niveau de gris
        opencv.invert(); // pour dessin au trait noir sur blanc
 
     
        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

Added lines 143-149:

!! Exemple webcam

(:source lang=processing:)

(:sourcend:)

Added lines 143-148:

!! 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 6.60 ms en mode "interprété"  soit une fréquence maximale potentielle de 15 fps.
** de 6.60 ms en mode "compilé"  soit une fréquence maximale potentielle de 15 fps.
Changed line 92 from:
import monclubelec.javacvProc.*; // importe la librairie javacvPro
to:
import monclubelec.javacvPro.*; // importe la librairie javacvPro
Changed line 25 from:
* Au total, l'utilisation du filtre de Sobel est grandement simplifiée avec cette fonction comparativement à la fonction OpenCV native.
to:
* Au total, l'utilisation du filtre de Sobel est grandement simplifiée avec cette fonction comparativement à la fonction OpenCV native. De plus, là encore, le délai d'exécution de la fonction est court ( 3 ou 4 millisecondes) ce qui permet de l'utiliser en direct sur un flux vidéo issu d'une webcam !
Changed line 25 from:
* Au total, l'utilisation du filtre de Sobel est grandement simplifié avec cette fonction comparativement à la fonction OpenCV native.
to:
* Au total, l'utilisation du filtre de Sobel est grandement simplifiée avec cette fonction comparativement à la fonction OpenCV native.
Changed line 67 from:
* Ce filtre est également assez sympa pour convertir une photo en "dessin au fusain" : il suffit pour cela, une fois le filtre appliqué de basculer en niveau de gris puis d'inverser l'image.
to:
* Ce filtre est également assez sympa pour convertir une photo en "dessin au fusain" : il suffit pour cela, une fois le filtre appliqué de basculer en niveau de gris puis d'inverser l'image. C'est magique ! Et dire que ce n'est que des maths...
Changed lines 8-9 from:
%center%Path:
to:
%center%Path:/mes_images/javacvpro/javacvpro_exemple_sobel.png
%center% Exemple fonction sobel() avec noyau 3x3 et coeff=0.8 et effet "dessin au fusain" par bascule niveau gris + invert()

Changed line 48 from:
public opencv_core.IplImage sobel (opencv_core.IplImage iplImgIn, int ksizeIn, float scaleIn)
to:
opencv.sobel(iplImg, ksize, scale); // applique le filtre sur l'objet IplImage avec taille noyau et coefficient
Changed lines 55-56 from:
*
to:
* ksize : taille du noyau de convolution à utiliser. =3 par défaut pour noyau de 3x3 pixels.
* scale : coefficient multiplicateur. =1 par défaut.
* iplImg : objet IplImage.

Changed lines 61-62 from:
Aucune
to:
Aucune. L'image source est modifiée.
Changed lines 65-66 from:
*
to:
* Le filtre de sobel est typiquement utilisé pour extraire les contours avant l'application d'une détection de formes. On applique classiquement un seuillage après pour éliminer les éléments non désirés. 

* Ce filtre est également assez sympa pour convertir une photo en "dessin au fusain" : il suffit pour cela, une fois le filtre appliqué de basculer en niveau de gris puis d'inverser l'image.

Changed lines 73-77 from:
to:
opencv.sobel(); // applique le filtre de sobel sur le buffer principal OpenCV avec paramètres par défaut noyau = 3 et coeff=1)
opencv.sobel(3); //applique le filtre de sobel sur le buffer principal OpenCV avec taille noyau - coeff=1 par défaut
opencv.sobel(3,0.8); //applique le filtre de sobel sur le buffer OpenCV désigné avec paramètres
opencv.sobel(opencv.Buffer,3,1); //applique le filtre de sobel sur le buffer OpenCV désigné avec paramètres

Added lines 85-140:

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

// Exemple fonction sobel()

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

PImage img;

String url="http://www.mon-club-elec.fr/mes_images/online/lena.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()); // 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 ---

        //-- toutes ces formes sont possibles :
        //opencv.sobel(); // applique le filtre de sobel sur le buffer principal OpenCV avec paramètres par défaut noyau = 3 et coeff=1)
        //opencv.sobel(3); //applique le filtre de sobel sur le buffer principal OpenCV avec taille noyau - coeff=1 par défaut
        opencv.sobel(3,0.8); //applique le filtre de sobel sur le buffer OpenCV désigné avec paramètres

        //opencv.sobel(opencv.Buffer,3,1); //applique le filtre de sobel sur le buffer OpenCV désigné avec paramètres
       
        //--- pour effet "dessin au fusain"
        opencv.gray(); // passage en niveau de gris
        opencv.invert(); // pour dessin au trait noir sur blanc
       
        //--- affiche image finale ---
        image(opencv.getBuffer(),opencv.width(),0); // affiche le buffer principal OpenCV dans la fenêtre Processing

      noLoop(); // stop programme       
}


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

}
Added lines 37-38:
public void sobel(int ksizeIn, float scaleIn)
public opencv_core.IplImage sobel (opencv_core.IplImage iplImgIn, int ksizeIn, float scaleIn)
Changed lines 44-47 from:
to:
opencv.sobel(); // applique le filtre sur le buffer principal - noyau = 3 - coeff = 1
opencv.sobel(ksize); // applique le filtre sur le buffer principal avec taille noyau - coeff = 1
opencv.sobel(ksize, scale); // applique le filtre sur le buffer principal avec taille noyau et coefficient
public opencv_core.IplImage sobel (opencv_core.IplImage iplImgIn, int ksizeIn, float scaleIn)
Added lines 14-15:
* Cet algorithme est paramétré essentiellement par la taille du noyau. Un coefficient multiplicateur peut également être appliqué pour accentuer le contour.
Added line 36:
public void sobel(int ksizeIn)
Changed lines 24-26 from:
* Voir également :
to:
* Voir également : canny(), sobel2()

* Pour plus d'informations, voir
:
Added lines 1-80:
(:notitle:)
(:include HautPageReference:)\\
[[Main.LibrairieJavacvPro|Librairie JavacvPro]]

! Classe OpenCV : sobel()
----

%center%Path:

!! Description

* Cette fonction implémente le filtre de Sobel qui est un algorithme de détection de contour par noyau de convolution. C'est un algorithme simple comparativement à l'algorithme de Canny, mais il est efficace.

* A noter que cet algorithme s'applique sur une image RGB et renvoie un résultat RGB.

* Cette fonction se base sur la fonction OpenCV native cvSobel() qui implémente le filtre de Sobel avec un noyau normalisé (c'est à dire que toutes les valeurs du noyau sont divisées par la taille du noyau) : http://opencv.itseez.com/modules/imgproc/doc/filtering.html#sobel

* A noter que la fonction native OpenCV est unidirectionnelle. La présente fonction implémente le filtre Sobel de façon bi-directionnelle : le filtre Sobel est appliqué en vertical puis le filtre Sobel est appliqué en horizontal. Les 2 sont ensuite combinés pour obtenir le contour complet.

* Enfin, l'application du filtre de Sobel nécessite l'utilisation d'une image supportant les valeurs signées négatives. La présente fonction gère automatiquement le basculement vers une image intermédiaire en nombre signé puis rebascule le résultat en mode RGB 8 bits non signés classique.

* Au total, l'utilisation du filtre de Sobel est grandement simplifié avec cette fonction comparativement à la fonction OpenCV native.

* Voir également :
** http://fr.wikipedia.org/wiki/Algorithme_de_Sobel
** http://en.wikipedia.org/wiki/Sobel_operator

!! Déclaration source java

(:source lang=java :)
public void sobel()
(:sourcend:)

!! Syntaxe

(:source lang=processing :)

(:sourcend:)


!! Paramètres

* opencv : un objet OpenCV déclaré avec le constructeur [[OpencvOpencv|OpenCV]].
*

!! Valeur renvoyée

Aucune

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