View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS

Presentation

Pourquoi cette nouvelle librairie ?

  • Il existe déjà une excellente librairie OpenCV pour Processing : http://ubaa.net/shared/processing/opencv/ J'ai personnellement fait mes premières armes avec OpenCV et la reconnaissance visuelle grâce à cette librairie. Voir ici notamment : Reconnaissance visuelle et suivi d'objet avec Processing
  • Ceci étant cette librairie présente plusieurs limites :
    • cette librairie est basée sur la version 1.0 de la librairie native OpenCV qui est actuellement à la version 2.3.1 et a été complètement restructurée, ce qui pose des problèmes de bugs ou d'installation.
    • le code source de cette librairie date de 2008 et ne semble plus être maintenu par ses auteurs, ce qui n'est jamais très engageant lorsque l'on base ses développements sur une librairie,...
    • les fonctions natives d'OpenCV ne sont pas simplement accessibles depuis le code Processing avec cette librairie et de ce fait, de nombreuses fonctions potentiellement très intéressantes ne sont pas disponibles, notamment en détection de contour, analyse de contour, recherche de points invariants, etc..
  • Ceci m'a poussé à me lancer dans l'écriture de cette nouvelle librairie implémentant OpenCV sous Processing. L'objectif est multiple :
    • implémenter les fonctions déjà disponibles avec la librairie existante http://ubaa.net/shared/processing/opencv/ avec la même syntaxe pour assurer la compatibilité des codes existants.
    • ajouter de nombreuses fonctions de traitement d'image avancées avec une syntaxe simple pour l'utilisateur Processing, notamment des fonctions de détection (filtre de Sobel, Canny) et d'analyse de contour (détection de ligne, de cercle (algorithme de Hough), test de convexité, recherche des points significatifs, ...)
    • disposer dans Processing de l'ensemble des fonctions OpenCV natives, ce qui est d'ors et déjà rendu possible grâce à l'excellente et incontournable librairie javacv de Samuel Audet, sans laquelle ma librairie n'aurait pas vu le jour.
    • implémenter sous Processing des algorithmes puissants d'analyse et de description d'image tels que SURF, SIFT, FAST, MSER, etc..

Articulation OpenCV - javacv - javacvpro et Processing

Pour bien comprendre :

  • OpenCV est la librairie de reconnaissance visuelle native écrite en C/C++/Python et n'est pas accessible en tant que telle en Java
  • javacpp (par Samuel Audet) est un wrapper (un pont) entre le C++ et le langage Java
  • javacv (par Samuel Audet) est l'implémentation en Java des fonctions OpenCV via le wrapper javacpp
  • Processing (par Ben Fry et Casey Reas et processing Team - MIT ), véritable couteau suisse logiciel, est une interface graphique open-source multiplateforme écrite en Java, permettant également la communication réseau, série, etc...
  • javacvPro (par moi-même, X. HINAULT) est l'implémentation sous forme de fonctions pour Processing des fonctions natives OpenCV, en utilisant les fonctions javacv qui elles-mêmes se basent sur le wrapper javacpp

Aspects techniques

  • La librairie native OpenCV annonce 2500 algorithmes de traitement d'image et de reconnaissance visuelle implémentés en C, C++, Python. La version courante est la version 2.3.1. Le site officiel : http://opencv.willowgarage.com/wiki/ Cette librairie n'est pas à ce jour directement compatible avec Processing et doit être "traduite" en Java, langage dans lequel est écrit Processing.
  • Or, il existe une librairie très complète appelée javacv de Samuel Audet qui implémente la très grande majorité des fonctions natives d'OpenCV en java. C'est donc tout naturellement que je me suis basé sur cette librairie aux centaines de fonctions pour écrire la librairie javacvPro.
  • La "clé" de l'implémentation des fonctions natives d'OpenCV C/C++ vers la langage Java repose sur une seconde librairie du même auteur, javacpp. Cette librairie assure la jonction entre le code Java et le code C/C++. Notamment, la plupart des classes (pour ne pas dire toutes) de la librairie javacv sont des sous-classes de la classe Pointer de la librairie javacpp.
  • Ceci étant, la librairie javacv ne dispense pas de la prise en main des objets fondamentaux de la librairie native OpenCV, des fonctions nombreuses et parfois complexes. L'ensemble s'apparente à une véritable "jungle" dans laquelle il n'est pas facile de distinguer l'utile de ce qui l'est moins. C'est pourquoi, la librairie javacvPro se donne pour objectif de simplifier pour l'utilisateur Processing l'utilisation des fonctions avancées de la librairie native OpenCV. A titre d'exemple, une fonction native openCV ayant la syntaxe :
cvCanny(opencv_core.CvArr image, opencv_core.CvArr edges, double threshold1, double threshold2, int aperture_size)

deviendra une fonction javacvPro de la forme (la librairie s'occupant de toute la "cuisine" OpenCV sous-jacente) :

canny(PImage image)
  • L'utilisateur avancé gardera cependant tout loisir d'appeler directement "in-line" depuis le code Processing les fonctions natives OpenCV de son choix, offrant dès lors un potentiel de développement quasi-illimité. La librairie javacvPro offre d'ailleurs à ce titre une aide précieuse en fournissant de nombreuses fonctions de transfert d'image entre les conteneurs OpenCV (IplImage) et Processing (PImage), permettant de mixer les fonctions natives OpenCV et Processing au sein d'un même programme.
  • Actuellement, la librairie javacvPro représente plus de 5000 lignes de code Java, certes probablement améliorable mais d'ors et déjà opérationnel. En espérant que cela soit utile !