View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS


Librairie JavacvPro

Classe OpenCV : canny()


Exemple fonction canny() avec seuil1=1000, seuil2=2000 et noyau=5.

Description

  • Le filtre de Canny est un algorithme avancé de détection de contours dans une image. Le résultat est un dessin fin des contours, à la façon "bande-dessinée". Cette fonction implémente dans Processing cet algorithme !
  • Cette fonction peut recevoir une image mono-canal ou RGB (3 canaux). En cas d'image RGB, celle-ci est convertie automatiquement en niveau de gris (voir gray()) avant que le filtre de Canny ne soit appliqué. Une copie du traitement final reste présente dans le buffer Gray.
  • Cet algorithme est paramétré par :
    • une taille de noyau de convolution
    • deux paramètres de seuillage, qui ne doivent être ni trop bas (pour éviter prise en compte du bruit) ni trop élévé (pour éviter non prise en compte de contours)
  • Cette fonction est basée sur la fonction OpenCV native cvCanny() : http://opencv.itseez.com/modules/imgproc/doc/feature_detection.html#canny
  • Pour plus de détails sur le filtre de Canny, voir :
  • Voir également : sobel(), sobel2(), scharr()

Déclaration source java

public void canny()
public void canny(double threshold1In, double threshold2In)
public void canny(double threshold1In, double threshold2In, int ksizeIn)
public opencv_core.IplImage canny (opencv_core.IplImage iplImgIn, double threshold1In, double threshold2In)
public opencv_core.IplImage canny (opencv_core.IplImage iplImgIn, double threshold1In, double threshold2In, int ksizeIn)

Syntaxe

opencv.canny(); // applique filtre canny au buffer principal par défaut (100, 200 et 3)
opencv.canny(threshold1, threshold2); // applique filtre canny au buffer principal avec paramètres et ksize par défaut =3
opencv.canny(threshold1, threshold2, ksize); // applique filtre canny au buffer principal avec paramètres

opencv.canny(iplImg); // applique filtre canny au buffer principal avec paramètres par défaut (100, 200 et 3)
opencv.canny(iplImg,threshold1, threshold2); // applique filtre canny au buffer principal avec paramètres et ksize par défaut =3
opencv.canny(iplImg, threshold1, threshold2, ksize); // applique filtre canny au buffer principal avec paramètres
 

Paramètres

  • opencv : un objet OpenCV déclaré avec le constructeur OpenCV.
  • threshold1 et threshold2 (double) : valeur de seuil 1 et 2 utilisées par l'algorithme. En pratique, utiliser threshold2 = 2xthreshold1. Valeurs usuelles 100 et 200. Faire des essais pour trouver le meilleur résultat adapté à votre situation.
  • ksize (int) : taille du noyau de convolution utilisé par l'algorithme. Par défaut = 3.
  • iplImg : objet IplImage

Valeur renvoyée

Aucune. L'image source est modifiée. Une copie est mise dans le buffer Gray.

Utilisation type

  • Cet algorithme pourra être utilisé pour détecter les contours en vue d'une détection et d'analyse de formes.

Exemple


opencv.canny(); // applique le filtre de canny sur le buffer principal OpenCV avec paramètres par défaut
opencv.canny(100,200); //applique le filtre de canny sur le buffer principal OpenCV avec paramètres - noyau 3x3 par défaut
opencv.canny(1000,2000,5); //applique le filtre de canny sur le buffer OpenCV désigné avec paramètres

opencv.canny(opencv.Buffer,100,400); //applique le filtre de canny sur le buffer OpenCV désigné avec paramètres - noyau 3x3 par défaut
opencv.canny(opencv.Buffer,100,200,3); //applique le filtre de canny sur le buffer OpenCV désigné avec paramètres
 

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 canny()

import monclubelec.javacvPro.*; // 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.canny(); // applique le filtre de canny sur le buffer principal OpenCV avec paramètres par défaut
        //opencv.canny(100,200); //applique le filtre de canny sur le buffer principal OpenCV avec paramètres - noyau 3x3 par défaut
        opencv.canny(1000,2000,5); //applique le filtre de canny sur le buffer OpenCV désigné avec paramètres

        //opencv.canny(opencv.Buffer,100,400); //applique le filtre de canny sur le buffer OpenCV désigné avec paramètres - noyau 3x3 par défaut
        //opencv.canny(opencv.Buffer,100,200,3); //applique le filtre de canny sur le buffer OpenCV désigné avec paramètres

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

}
 

Exemple webcam


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

        //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.canny(); // applique le filtre de canny sur le buffer principal OpenCV avec paramètres par défaut
        //opencv.canny(100,200); //applique le filtre de canny sur le buffer principal OpenCV avec paramètres - noyau 3x3 par défaut
        opencv.canny(1000,2000,5); //applique le filtre de canny sur le buffer OpenCV désigné avec paramètres

        //opencv.canny(opencv.Buffer,100,400); //applique le filtre de canny sur le buffer OpenCV désigné avec paramètres - noyau 3x3 par défaut
        //opencv.canny(opencv.Buffer,100,200,3); //applique le filtre de canny sur le buffer OpenCV désigné avec paramètres

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

 

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 2.73 ms en mode "interprété" soit une fréquence maximale potentielle de 36 fps.
    • de 2.57 ms en mode "compilé" soit une fréquence maximale potentielle de 38 fps.

Commentaires utilisateurs

Aucun

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