View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS

Page d'accueil de la documentation de la librairie javacvPro

javacvPro, librairie Processing de traitement d'image et de vision par ordinateur en "temps-réel"

News

  • Octobre 2012 : mise à jour de la doc et de la librairie JavacvPro 0.5 pour Opencv 2.4.2 sous Ubuntu LTS 12.04

Certains changements de la librairie Opencv 2.4.x entraînent des modifications importantes au niveau de l'utilisation de l'algorithme SURF qui devient actuellement inutilisable avec JavacvPro. A suivre...

Présentation

  • La librairie javacvPro est une librairie opensource et libre pour Processing qui implémente des fonctions avancées de traitement d'image et de reconnaissance visuelle basée sur la librairie OpenCV 2.3.1 : ce sont près de 100 fonctions de traitement d'image de base ou avancé qui sont ainsi disponibles simplement depuis Processing permettant en quelques lignes de réaliser des suivis d'objets ou des reconnaissances de formes avancés en temps réel.
  • La librairie javacvPro est basée sur l'excellent wrapper javacv (de Samuel Audet) qui assure l'interface entre le langage C/C++ (OpenCV natif) et le langage Java (Processing). Plus précisément, la librairie javacvPro se base essentiellement sur la librairie javacv.cpp du projet javacv : javacv.cpp intègre le portage Java de la plupart des centaines de fonctions natives OpenCV !
  • La librairie javacvPro est un projet distinct de la librairie OpenCV "hypermédia" pour Processing suivante : http://ubaa.net/shared/processing/opencv/
  • La plupart des fonctions de cette dernière librairie sont implémentées (ou bien ont un équivalent) dans la librairie javacvPro
  • La librairie javacvPro est basée sur la dernière version de la librairie OpenCV (version 2.3.1) et propose plusieurs fonctions avancées exclusives.

Galerie vidéo

absDiff() drawBlobs() drawConvexityDefect() detectFinger()

On en parle...

Performances obtenues pour le traitement d'un flux vidéo en temps réel (real time image processing)

  • La librairie Javacvpro 0.4beta en cours de développement permet d'atteindre en résolution 320x240 couleur des débits de traitement d'image jusqu'à 80-90 fps (images par seconde) dans Processing (avec une webcam adaptée, notamment la Eye PS3 de Sony) pour :
    • les suivis d'objets colorés (80-90 fps!)
    • les suivis de visage / corps (30 fps)
    • l'analyse et la détection des points de convexité
    • la soustraction de fond par mémorisation
    • la détection de markers ARToolkit et l'extraction d'information 3D
    • etc...
  • Des débits de l'ordre de 10-20 fps sont atteints avec les algorithmes de recherche de concordance 3D type SURF à la même résolution 320x240.
  • Pour plus de détails sur la capture et le traitement de flux vidéo webcam à "haute vitesse" (sup à 30 fps) voir les pages :

Ressources utilisées

  • Cette librairie crée une interface entre l'interface graphique Processing (java) et la librairie native de traitement d'image OpenCV (C/C++) : ces deux ressources libres et open-source sont les piliers indispensables de la librairie javacvPro !
  • Cette librairie repose également sur les excellentes et très complètes librairies javacv et javacpp de Samuel Audet. Sans son travail, javacvPro n'existerait pas !
  • Voir également : Javacv : librairie java implémentant la librairie opensource C/C++ OpenCV.

Pré-requis

JavacvPro est multi-OS

JavacvPro nécessite la librairie OpenCV 2.4.2

Autres liens divers utiles au besoin

JavacvPro nécessite Processing 1-5.1

  • L'utilisation de la librairie javacvPro suppose que Processing (1-5 ou suivant) soit installé et fonctionne normalement sur votre système. Voir ici : http://processing.org/download/

JavacvPro est à utiliser de préférence avec GSVideo pour la capture Vidéo sous Processing

Pour info, voici la liste des dépendances nécessaires sous Ubuntu 12.04 LTS :

  • gir1.2-gstreamer-0.10
  • gstreamer0.10-alsa
  • gstreamer0.10-ffmpeg
  • gstreamer0.10-fluendo-mp3
  • gstreamer0.10-gnomevfs
  • gstreamer0.10-gnonlin
  • gstreamer0.10-nice
  • gstreamer0.10-plugins-bad
  • gstreamer0.10-plugins-base
  • gstreamer0.10-plugins-base-apps
  • gstreamer0.10-plugins-good
  • gstreamer0.10-plugins-ugly
  • gstreamer0.10-pulseaudio
  • gstreamer0.10-tools
  • gstreamer0.10-x
  • libgstreamer-perl
  • libgstreamer-plugins-bad0.10-0
  • libgstreamer-plugins-base0.10-0
  • libgstreamer-plugins-base0.10-dev
  • libgstreamer0.10-0
  • libgstreamer0.10-dev

Les fonctions ARToolkit de la librairie JavacvPro nécessite l'installation préalable de la librairie nyar4psg

Téléchargement

  • La version courante est ici : javacvPro-0.5 (Octobre 2012) - compatible OpenCV 2.4.2 et Ubuntu 12.04 LTS

Versions précédentes :

Installation de la librairie

  • La librairie s'installe comme toute librairie pour Processing 1-5-1 : répertoire Processing /Mode/java/libraries. Copier le sous-répertoire javacvPro de l'archive dans ce répertoire.

Détails es versions

JavacvPro 0.5 (Octobre 2012)

  • Essentiellement mise à niveau de la librairie pour compatibilité avec la nouvelle version d'openCV 2.4.2 et Ubuntu LTS 12.04

Certains changements de la librairie Opencv 2.4.x entraînent des modifications importantes au niveau de l'utilisation de l'algorithme SURF qui devient actuellement inutilisable avec JavacvPro. A suivre...

JavacvPro 0.4 (Avril 2012)

  • fonctions allocateBuffer() et allocateMemory() pour permettre l'utilisation d'une image de taille différente dans le Buffer et Memory
  • fonction copyToMemory (équiv remember())
  • nouvelle classe Keypoint correspondant aux caractéristiques des points-clés utilisés avec les fonction natives openCV feature2D
  • fonction avancée de sélection des blobs keypointsSBD() basée sur la classe native openCV SimpleBlobDetector
  • fonction de tracé d'un tableau de points-clé Keypoint drawKeypoints()
  • Fonctions de détection de concordances entre une image objet et une image scene à l'aide de l'algorithme SURF :
    • initiSURF()
    • keypointsSURF()
    • drawKeypoints()
    • detectMatchSURF()
    • keypointsMatchSURF()
    • drawLinesMatchSURF()
    • selectGoodMatchSURF()
    • keypointsGoodMatchSURF()
    • detectObjectIntoSceneSURF()
    • keypointsToPoints()
  • Fonctions de détection de cercle et lignes par Hough
  • Plusieurs fonctions géométriques utiles
  • Inclusion de la librairie nyar4psg (implémentation pour Processing de ARToolkit) qui permet la détection de "markers" dans une image
  • ajouts d'une classe et de fonctions dédiées de gestion facilitée des "markers" ARToolkit : dessin, extraction centre 2D, extraction repère 3D, ...
  • Correctifs divers
    • fonction fromPImage : amélioration significative du délai de chargement du PImage dans OpenCV, délai qui est divisé d'un facteur 10 à 20, permettant d'atteindre facilement des débits de traitement de 30 fps en 320x240 avec une simple webcam.
    • fonction toPImage : amélioration de la vitesse de transfert
    • fonction detect() : ajout de la forme detect(coeff, debug) où coeff augmente la vitesse de détection significativement.
    • fonctions copyToGray
    • fonction selectBall : correction code de sélection géométrique

JavacvPro 0.3

  • La version 0.3 par X. HINAULT - Novembre 2011. Cette version intègre près de 70 fonctions principales (elles-mêmes déclinées en variantes). Les nouveautés de cette version sont les suivantes :
    • un nouvel objet : ConvexityDefect, descripteur des "creux" significatifs d'un contour de forme, intégrant le calcul automatique des distances entre les points, de l'angle utile.
    • fonctions supplémentaires utiles pour l'analyse de base des images :
      • sum : fonction réalisant la somme canal par canal de tous les pixels d'une image - utile notamment pour la détection de mouvement
      • fill : fonction permettant de remplir tous les pixels d'une image avec la même valeur
      • addWeighted : fonction réalisant la somme pondérée pixel à pixel de 2 images
      • average : fonction réalisant la moyenne pixel à pixel de 2 images
    • fonctions d'analyse des ConvexityDefect d'une forme :
      • convexityDefects() : extraction des Convexity Defect
      • detectFinger() : fonction d'analyse des doigts comptés à partir d'un pourtour de forme de main
      • drawConvexityDefects() : fonction de dessin d'un tableau d'objet ConvexityDefect
    • fonctions de soustraction du fond
      • accumulate : fonction permettant la mémorisation cumulée
      • MOG : une fonction native openCV avancée utilisant les "Mixture of Gaussian"
      • MOG2 : : une autre fonction native OpenCV avancée plus élaborée utilisant également les "Mixture of Gaussian"
    • fonctions mathématiques utiles :
      • distance(Point, Point) : calcul de la distance entre 2 points.
      • calculAngleRadAlKashi(float, float, float) : calcul de l'angle d'un triangle quelconque à partir des 3 côtés.
      • calculCoteRadAlKashi(float, float, float) : calcul d'un côté d'un triangle quelconque à partir 2 côtés et 1 angle.

La suite à venir

  • Les nouveautés prévisionnelles à venir sont :
    • fonctions de détections de coins (Harris)
    • fonctions de calcul des pixels en lignes, colonnes
    • fonctions de détection de damier (chessBoard)
    • fonction de calcul de la distorsion de la webcam
    • autres fonctions de concordance 3D ( SIFT, ..)
    • fonctions d'histogramme

Historique des versions

  • version 0.1 : version de lancement initiée en Septembre 2011 par X. HNAULT. www.mon-club-elec.fr - non disponible au téléchargement.
  • La version 0.2 : première version disponible en téléchargement et comportant environ 50 fonctions opérationnelles. Octobre 2011 par X. HNAULT. www.mon-club-elec.fr
  • La version 0.3 : 70 fonctions opérationnelles. Janvier 2012 par X. HNAULT. www.mon-club-elec.fr
  • La version 0.4 : 100 fonctions opérationnelles. Avril 2012 par X. HNAULT. www.mon-club-elec.fr
  • La version 0.5 : Mise à niveau pour Opencv 2.4.2 et Ubuntu 12.04 LTS - Octobre 2012 par X. HNAULT. www.mon-club-elec.fr

Support

  • J'utilise quotidiennement les fonctions de ma librairie : elles sont donc régulièrement testées et mises en situation réelle. Ceci étant, il s'agit de ma première librairie Processing et de ma première véritable immersion dans la programmation avec les fonctions natives d'OpenCV : merci d'être indulgent.
  • Pour tous les retours, questions, suggestions,utiliser l'adresse suivante : support_at_mon-club-elec_point_fr

Principe général d'utilisation

  • Pour écrire un programme Processing utilisant la librairie javacvPro, il suffit d'importer la librairie dans l'entête du programme :
import monclubelec.javacvPro.*; // importe la librairie javacvPro
  • Ensuite, il faut créer une instance de la classe principale OpenCV qui va donner accès à toutes les fonctions utiles :
OpenCV opencv; // déclare un objet OpenCV principal
  • Ensuite, au niveau de la fonction setup(), il faut initialiser l'objet OpenCV créé et définir la taille d'image à utiliser pour les "buffers image" à l'aide de la fonction allocate.
opencv = new OpenCV(this); // initialise objet OpenCV à partir du parent This
        opencv.allocate(320,240); // crée le buffer image de la taille voulue
  • Les fonctions de la classe OpenCV sont accessibles sous la forme générale opencv.nomFonction(). Se reporter à la documentation et aux exemples des nombreuses fonctions pour avoir les détails d'utilisation.
  • Voici le code "minimum" qui doit compiler si vous avez bien installé la librairie javacvPro et OpenCV 2.3.1 sur votre système :

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

OpenCV opencv; // déclare un objet OpenCV principal

void setup(){ // fonction d'initialisation exécutée 1 fois au démarrage


        opencv = new OpenCV(this); // initialise objet OpenCV à partir du parent This
        opencv.allocate(320,240); // crée le buffer image de la taille voulue

}


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

}
 

Les buffers images de la classe OpenCV

Présentation

  • La classe OpenCV de la librairie javacvPro crée automatiquement lors de l'initialisation (fonction allocate() ) plusieurs "buffers image" (mémoires images) qui permettent la manipulation simplifiées des images à l'aide des fonctions de la librairie avec OpenCV. La liste des buffers disponibles est la suivante :
    • le buffer principal, image à trois canaux RGB, sur lequel sont appliquées par défaut la plupart des fonctions de la librairie.
    • le buffer Gray, en niveaux de gris, monocanal
    • le buffer R, pouvant recevoir le canal rouge, monocanal.
    • le buffer G, pouvant recevoir le canal vert, monocanal.
    • le buffer B, pouvant recevoir le canal bleu, monocanal.
    • le buffer Memory, qui permet le stockage d'image 3 canaux (voir fonction remember() ).
    • le buffer Memory2, qui permet le stockage d'une image 3 canaux également (voir fonction remember2() ).

Vue d'ensemble des buffers Javacvpro

Initialisation des buffers

  • Tous les buffers sont initialisés et dimensionnés à la même taille à l'aide de la fonction allocate().
  • Pour une initialisation séparée avec des tailles différentes des buffers images et des buffers Memory et Memory2, utiliser les fonctions allocateBuffer() et/ou allocateMemory(), allocateMemory2().
  • Ceci sera particulièrement utile notamment dans le cas de l'utilisation des algorithmes de recherche de correspondance entre une image objet et une scène (avec SURF par exemple).

Informations utiles pour un usage avancé de la librairie javacvPro.

  • Les buffers sont en fait des objets IplImage (conteneur image natif de la librairie OpenCV) implémentés par la librairie javacv (sur laquelle est basée la librairie javacvPro).
  • La plupart des fonctions de la classe OpenCV de la librairie javacvPro sont appliquées par défaut sur le buffer principal.
  • Mais on pourra également utiliser directement les autres buffers en les appelant par leur nom pour toutes les fonctions de la classe OpenCV de la librairie javacvPro qui acceptent en paramètre un objet IplImage. Il suffira dans ce cas de spécifier le buffer voulu par son nom. Par exemple :
opencv.fonction(opencv.Memory2);

où opencv est un objet OpenCV.

Dénomination des buffers de la classe OpenCV :

  • Les noms des buffers disponibles sont :
    • Buffer : buffer principal (3 canaux RGB)
    • BufferGray : buffer Gray (monocanal)
    • BufferR : buffer canal rouge (monocanal)
    • BufferG : buffer canal vert (monocanal)
    • BufferB : buffer canal bleu (monocanal)
    • Memory : buffer mémoire image (3 canaux RGB)
    • Memory2 : buffer mémoire image n°2 (3 canaux RGB)
  • La désignation d'un buffer à l'aide de son nom se fera sous la forme opencv.nom

Identifiants des buffers de la classe OpenCV :

  • Les buffers de la classe OpenCV peuvent également être appelés par les identifiants prédéfinis suivants avec les fonctions recevant un String en paramètre :
    • BUFFER : buffer principal (3 canaux RGB)
    • GRAY : buffer Gray (monocanal)
    • RED : buffer canal rouge (monocanal)
    • GREEN : buffer canal vert (monocanal)
    • BLUE : buffer canal bleu (monocanal)
    • MEMORY : buffer mémoire image (3 canaux RGB)
    • MEMORY2 : buffer mémoire image n°2 (3 canaux RGB)

Synthèse des fonctions utiles pour la manipulation des buffers JavacvPro

Cliquer sur l'image pour agrandir.


Librairie et documentation créés et maintenus par X. HINAULT - 2011 - 2012 - www.mon-club-elec.fr - Tous droits réservés - Contenus sous licence GPL v3