View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS


Librairie JavacvPro

Classe OpenCV : threshold()


Description

  • Cette fonction applique un effet de seuil au buffer principal ou à l'image reçue en paramètre. Un effet de seuil (ou seuillage) consiste à ne conserver que les pixels supérieurs ou inférieurs à une certaine limite, les autres étant selon les cas mis à 0 ou au niveau maximum (255).
  • Cette fonction est typiquement utilisée après un filtre de contour ou de couleur pour isoler au mieux les pixels significatif avec l'exécution d'une commande de reconnaissance de forme.
  • La fonction threshold() s'applique sur une image en niveau de gris. La fonction applique donc automatiquement la fonction gray() au buffer principal RGB avant d'appliquer le seuillage. Si l'on souhaite appliquer le seuillage sur un canal RGB précis, il suffit d'extraire ce canal et de lui appliquer le seuillage.
  • Voir également :

Déclaration source java

public void threshold (float seuilIn )
public void threshold (float seuilIn, String methodIn )
public void threshold (int seuilIn )
public void threshold (int seuilIn, String methodIn )
public opencv_core.IplImage threshold (opencv_core.IplImage iplImgIn, int seuilIn, String methodIn )
public opencv_core.IplImage threshold (opencv_core.IplImage iplImgIn, float seuilIn, String methodIn )

Syntaxe

opencv.threshold(val); // applique seuillage sur buffer principal basé sur seuil val en mode "BINARY"
opencv.threshold(val, mode); // applique seuillage sur buffer principal  basé sur seuil val selon mode fixé par mode
opencv.threshold(iplImg,val,mode); // applique seuillage sur objet IplImage  basé sur seuil val selon mode fixé par mode

Paramètres

  • opencv : un objet OpenCV déclaré avec le constructeur OpenCV.
  • val (int ou float) : valeur seuil de référence à utiliser : soit entre 0 et 255, soit entre 0 et 1
  • mode (string) : chaine de caractère fixant le mode de seuillage à utiliser parmi :
    • BINARY
    • BINARY_INV
    • TRUNC
    • TOZERO
    • TOZERO_INV

Valeur renvoyée

Aucune. L'image source ou l'image du buffer principal est modifiée.

Utilisation type

  • Cette fonction est typiquement utilisée après un filtre de contour ou de couleur pour isoler au mieux les pixels significatif avec l'exécution d'une commande de reconnaissance de forme.

Exemple


opencv.threshold(0.5, "BINARY"); // applique seuillage binaire avec seuil 0.5 sur le buffer principal
opencv.threshold(0.5); // autre forme
opencv.threshold(opencv.Memory,0.5, "BINARY"); // autre forme

 

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

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()*3); // 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 et affichage ---
        opencv.copy(img); // charge le PImage dans le buffer OpenCV
        opencv.threshold(0.5, "BINARY"); // applique seuillage binaire avec seuil 0.5 sur le buffer principal
        opencv.threshold(0.5); // autre forme
        opencv.threshold(opencv.Buffer,0.5, "BINARY"); // autre forme
        image(opencv.getBuffer(),opencv.width(),0); // affiche le buffer principal OpenCV dans la fenêtre Processing

        opencv.copy(img); // charge le PImage dans le buffer OpenCV
        opencv.threshold(0.5, "BINARY_INV"); // applique seuillage binaire inversé avec seuil 0.5 sur le buffer principal
        image(opencv.getBuffer(),0,opencv.height()); // affiche le buffer principal OpenCV dans la fenêtre Processing

        opencv.copy(img); // charge le PImage dans le buffer OpenCV
        opencv.threshold(0.5, "TRUNC"); // applique seuillage TRUNC inversé avec seuil 0.5 sur le buffer principal
        image(opencv.getBuffer(),opencv.width(),opencv.height()); // affiche le buffer principal OpenCV dans la fenêtre Processing

        opencv.copy(img); // charge le PImage dans le buffer OpenCV
        opencv.threshold(0.5, "TOZERO"); // applique seuillage TOZERO avec seuil 0.5 sur le buffer principal
        image(opencv.getBuffer(),0,opencv.height()*2); // affiche le buffer principal OpenCV dans la fenêtre Processing

        opencv.copy(img); // charge le PImage dans le buffer OpenCV
        opencv.threshold(0.5, "TOZERO_INV"); // applique seuillage TOZERO inversé avec seuil 0.5 sur le buffer principal
        image(opencv.getBuffer(),opencv.width(),opencv.height()*2); // affiche le buffer principal OpenCV dans la fenêtre Processing

       noLoop(); // stop programme
}


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

}

 

Exemple webcam

Remarquer sur cet exemple la fluidité du traitement malgré 6 utilisations de l'image de départ.


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

// Exemple fonctions threshold

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*3); // 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()  

        opencv.remember(); // mémorise l'image de départ dans le Buffer Memory


        //opencv.copy(img); // charge le PImage dans le buffer OpenCV
        opencv.restore(); // copie Memory dans buffer principal
        opencv.threshold(0.5, "BINARY_INV"); // applique seuillage binaire inversé avec seuil 0.5 sur le buffer principal
        image(opencv.getBuffer(),0,opencv.height()); // affiche le buffer principal OpenCV dans la fenêtre Processing

        //opencv.copy(img); // charge le PImage dans le buffer OpenCV
        opencv.restore(); // copie Memory dans buffer principal
        opencv.threshold(0.5, "TOZERO"); // applique seuillage TOZERO avec seuil 0.5 sur le buffer principal
        image(opencv.getBuffer(),0,opencv.height()*2); // affiche le buffer principal OpenCV dans la fenêtre Processing


        opencv.restore(); // copie Memory dans buffer principal
        opencv.threshold(0.5, "BINARY"); // applique seuillage binaire avec seuil 0.5 sur le buffer principal
        //opencv.threshold(0.5); // autre forme
        //opencv.threshold(opencv.Buffer,0.5, "BINARY"); // autre forme
        image(opencv.getBuffer(),opencv.width(),0); // affiche le buffer principal OpenCV dans la fenêtre Processing

        //opencv.copy(img); // charge le PImage dans le buffer OpenCV
        opencv.restore(); // copie Memory dans buffer principal
        opencv.threshold(0.5, "TRUNC"); // applique seuillage TRUNC inversé avec seuil 0.5 sur le buffer principal
        image(opencv.getBuffer(),opencv.width(),opencv.height()); // affiche le buffer principal OpenCV dans la fenêtre Processing

        //opencv.copy(img); // charge le PImage dans le buffer OpenCV
        opencv.restore(); // copie Memory dans buffer principal
        opencv.threshold(0.5, "TOZERO_INV"); // applique seuillage TOZERO inversé avec seuil 0.5 sur le buffer principal
        image(opencv.getBuffer(),opencv.width(),opencv.height()*2); // affiche le buffer principal OpenCV dans la fenêtre Processing


        println("Durée traitement image par OpenCV=" + (millis()-millis0)+" ms.");


  } // fin if available

} // fin draw

 

Durée d'exécution de la fonction

  • La réalisation de 100 exécutions successives de la fonction (avec "BINARY") 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 0.53 ms en mode "interprété" soit une fréquence maximale potentielle de 183 fps.
    • de 0.53 ms en mode "compilé" soit une fréquence maximale potentielle de 183 fps.

Commentaires utilisateurs

Aucun

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