Logo Mon Club Elec

Processing : Javacv « inline » : Redimmensionner un objet IplImage (conteneur Image OpenCV).

Le traitement d’image est une tâche complexe qui nécessite des outils spécialisés. La bibliothèque JavaCV offre une solution puissante et flexible pour le traitement d’image. Elle permet aux développeurs de manipuler des images en utilisant le conteneur IplImage. Dans cet article, nous allons voir comment redimensionner un objet IplImage avec JavaCV « inline ». Nous verrons comment utiliser les fonctionnalités de JavaCV pour redimensionner une image et comment cela peut être utile dans le traitement d’image.

Processing : Javacv « inline » : Redimmensionner un objet IplImage (conteneur Image OpenCV).

Processing : Javacv « inline » : Redimmensionner un objet IplImage (conteneur Image OpenCV).

Explications

  • Dans ce programme, on réalise le redimensionnement d’un objet IplImage dans Processing toujours en utilisant les fonctions javacv directement dans le programme Processing !
  • Ici, on charge un fichier dans un objet IplImage, on affiche les caractéristique de l’objet, on crée un second objet IplImage ayant une taille multipliée par un coefficient, on réalise une copie du premier dans le second à l’aide d’une fonction de redimensionnement, puis on transfère l’objet IplImage obtenu dans un PImage via un objet BufferedImage. On termine par l’affichage du PImage.
  • On utilise ici, via javacv, la version C de la fonction cvResize() : http://opencv.willowgarage.com/documentation/c/imgproc_geometric_image_transformations.html#resize

Matériel et configuration utilisés

  • PC Intel Core Quad 2.33 Ghz
  • Ubuntu 10.04 LTS
  • Processing 1-5
  • OpenCV 2.3.1
  • librairie javacv

Ressources utiles

Le programme

// Par X. HINAULT – www.mon-club-elec.fr
// Tous droits réservés – Code sous licence GPLv3
// Octobre 2011

// test simple des fonctions javacv dans un programme Processing
// ce programme montre comment redimmensionner un objet IplImage
// en accédant aux propriétés de l’objet IplImage

import com.googlecode.javacv.*; // importe librairie javacv
import com.googlecode.javacv.cpp.*; // importe librairie javacv
// librairie javacv par Samuel Audet : http://code.google.com/p/javacv/

// javacv implémente en Java les centaines de fonctions de la librairie OpenCV !
// la librairie doit être présente dans le répertoire /mode/java/libraries/javacv/library/

// NB : La librairie javacv est basée sur la librairie javacpp du même auteur : http://code.google.com/p/javacpp/

import java.awt.image.BufferedImage; // importe la classe java BufferedImage

PImage imgDest; // crée un objet PImage

void setup() {

  String cheminFichier=« /home/hinault/Bureau/trans/monimage.png »; // chemin absolu du fichier utilisé

  //—- appel direct des fonctions de la librairie javacv —-

  //— chargement d’un fichier image
  opencv_core.IplImage iplImgSrc; // création d’un objet opencv IplImage = matrice d’image

  //iplImgSrc= opencv_highgui.cvLoadImage(cheminFichier); // chargement d’un fichier dans l’IplImage
  iplImgSrc= opencv_highgui.cvLoadImage(cheminFichier,1); // chargement d’un fichier dans l’IplImage – variante qui fixe le type d’image chargée
  // 1 : image RGB (3 canaux) , 0: image gray (1 canal), -1 : idem à la source

  //— paramètre agrandissement
  float coeff=2.5; // coefficient de grandissement
  size(int(iplImgSrc.width()*coeff),int(iplImgSrc.height()*coeff));
  frameRate(15); // fréquence affichage Processing

  //— création d’une image IplImage destination —
  //opencv_core.CvSize mySize=iplImgSrc.cvSize(); // récupère la taille de l’image – Cvsize est un objet contenant 2 valeurs
  opencv_core.CvSize mySize=opencv_core.cvSize(int(iplImgSrc.width()*coeff),int(iplImgSrc.height()*coeff)); // nouvelle taille

  // static opencv_core.IplImage cvLoadImage(java.lang.String filename)
  //opencv_core.IplImage iplImgDest= opencv_core.cvCreateImage(mySize, opencv_core.IPL_DEPTH_8U, 3); // crée une image IplImage 8bits , 3 canaux
  //opencv_core.IplImage iplImgDest= opencv_core.cvCreateImage(mySize,iplImgSrc.depth() , iplImgSrc.nChannels()); // crée une image IplImage identique à iplImgSrc
  // alternative – utilise largeur/hauteur de l’image

  opencv_core.IplImage iplImgDest= opencv_core.cvCreateImage(mySize,iplImgSrc.depth() , iplImgSrc.nChannels()); // crée une image IplImage basée sur nouvelle taille

  // — le champ opencv_core.IPL_DEPTH_8U correspond à 1 codage 8 bits de l’image
  // — on utilise ici 3 canaux —
  // — à noter : on pourrait utiliser la fonction iplImgSrc.depth() pour utiliser le même nombre de canaux que iplImgSrc

  //—— affichage des caractéristiques de l’objet IplImage
 println(« — caractéristiques de l’objet IplImage source —« );
 println(« Taille : «  + iplImgSrc.width() +  » x «  + iplImgSrc.height() + » pixels. »);
 println(« Nombre de canaux : «  + iplImgSrc.nChannels()+ » canaux. »);
 println(« Codage sur «  + iplImgSrc.depth()+ » bits. »);

 //— copie l’objet IplImage dans un autre objet IplImage —
 //opencv_core.cvCopy(iplImgSrc, iplImgDest);  
 // — attention : src et dst doivent avoir la même taille, le même nombre de canaux (nChannels) et être codées sur le même nombre de bits (depth)

 //— redimensionne IplImage source vers IplImagDestination
 opencv_imgproc.cvResize(iplImgSrc, iplImgDest);  
 //opencv_imgproc.cvResize(iplImgSrc, iplImgDest, opencv_imgproc.CV_INTER_CUBIC);  // variante – utilise interpolation

  //—— affichage des caractéristiques de l’objet IplImage
 println(« — caractéristiques de l’objet IplImage de destination —« );
 println(« Taille : «  + iplImgDest.width() +  » x «  + iplImgDest.height() + » pixels. »);
 println(« Nombre de canaux : «  + iplImgDest.nChannels()+ » canaux. »);
 println(« Codage sur «  + iplImgDest.depth()+ » bits. »);

  //============ récupérer une image openCV dans Processing =====
  //— récupérer l’objet IplImage dans un BufferedImage – objet utilisé pour « passer » l’image de opencv vers Processing
  BufferedImage bufImg=iplImgDest.getBufferedImage(); // récupère IplImage dans un objet BufferedImage

  //—- créer un PImage —
  PImage img = createImage(iplImgDest.width(),iplImgDest.height(), RGB); // création d’un PImage

  // charge les pixels de l’image buffer dans le tableau  img.pixels du PImage
  //bufImg.getRGB(0, 0, iplImgDest.width(), iplImgDest.height(), img.pixels, 0, 320);
  bufImg.getRGB(0, 0, iplImgDest.width(), iplImgDest.height(), img.pixels, 0, iplImgDest.width());

  img.updatePixels(); // met à jour le PImage

  image(img,0,0); // affiche le PImage

}

void draw() {

}
 

Noter cet article

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Archive Mon Club Elec

Articles populaires

Newsletter

Inscrivez-vous maintenant et bénéficiez d'un soutien continu pour réaliser vos travaux électriques en toute sécurité.