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 !
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 :
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 !
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
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, 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
voidsetup(){// 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
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 :
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