javacvPro, librairie Processing de traitement d'image et de vision par ordinateur en "temps-réel"
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 : 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.
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 !
La librairie javacvPro a été testée sous Ubuntu 10.04 LTS. A priori, elle est utilisable sous Windows, Mac, Linux. Les retours d'expérience sont les bienvenus. Voir le test réalisé sur les 3 plateformes ici : http://codeanticode.wordpress.com/2011/11/21/opencv-2-in-processing/
JavacvPro nécessite la librairie OpenCV 2.3.1.
La librairie javacvPro nécessite l'installation préalable de la version 2.3.1. de la librairie OpenCV :
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/
Téléchargement
La dernière version de la librairie est disponible ici : javacvPro-0.3 (Novembre 2011)
La librairie s'installe comme toute librairie pour Processing 1-5 : répertoire Processing /Mode/java/libraries. Copier le sous-répertoire javacvPro de l'archive dans ce répertoire.
Versions
La version courante
La version actuelle est 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.Octobre 2011 par X. HNAULT. www.mon-club-elec.fr
La version à venir
La prochaine version sera la version 0.4.
La version 0.4 implémente :
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()
Correctifs divers
fonction fromPImage
fonctions copyToGray
La suite à venir
Les nouveautés prévisionnelles à venir sont :
fonctions de détections de coins (Harris)
fonctions de détections de lignes, cercle (Hough)
fonctions de calcul des pixels en lignes, colonnes
fonctions de détection de damier (chessBoard)
fonctions de concordance 3D (SURF, 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
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() ).
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)
Librairie et documentation créés et maintenus par X. HINAULT - 2011 - www.mon-club-elec.fr - Tous droits réservés - Contenus sous licence GPL v3