View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS


Librairie JavacvPro

Utiliser Nyar4Psg (implémentation ARToolkit pour Processing) avec JavacvPro


ARToolkit, c'est quoi ?

  • ARToolkit, pour "Augmented Reality Tool kit" ou "boite à outils pour la réalité augmentée" est une technique basée sur la détection et la reconnaissance de "marker" ou "pattern" dans une image vidéo permettant :
    • la reconnaissance du marker correspondant (plus de 4000 markers différents possibles, carrés noir et blanc diversement "remplis" à la façon d'un damier,
    • l'extraction des informations 3D du marker, notamment de la transformation de perspective
    • permettant de remplacer dans l'image vidéo le marker par un objet 3D qui pourra ainsi "suivre" les mouvements du marker.
  • ARToolkit est une librairie qui permet de mettre en oeuvre simplement de la réalité augmentée en se basant sur la reconnaissance visuelle de « marker » qui sont des « carrés » avec un sigle composé de carrés noirs/ blancs...
  • Cette librairie fournit les fonctions de détection des « marker » dans une image, le calcul de la perspective correspondante, l'analyse du marker.
  • Ensuite, dans Processing notamment, on peut associer chaque « marker » à tel ou tel objet 3D ou autre..

Intérêt

Pourquoi c'est intéressant ?

  • La technique utilisée comporte une solution de seuillage de binarisation automatique qui s'adapte à la luminosité ambiante automatique ce qui rend la mise en oeuvre simple dans des conditions d'éclairage différentes.
  • La technique apparaît très robuste en détection y compris avec des seuils de confiance élevés (càd un niveau de probabilité de correspondance élevé, de l'ordre 80% par exemple)
  • La reconnaissance est indépendante de la perspective et de la rotation. La reconnaissance est bonne (pour ne pas dire excellente) à des distance de l'ordre de 4m pour une taille de marqueur de 15x15 environ
  • La reconnaissance est également tolérante à la déformation du marker
  • L'utilisation de la CPU est très modeste et la reconnaissance très fluide et rapide permettant une réactivité en temps réel très fluide.
  • Après quelques tests, j'estime cette technique très intéressante et performante :
    • la détection des markers est robuste, indépendemment de la luminosité
    • la reconnaissance du type de marker est très discriminante (parmi 10 markers différents, le taux de détection exacte est de l'ordre de 90 à 100% !)
    • la récupération des informations 3D du marker est relativement aisée
    • et surtout, la reconnaissance des markers sur un flux vidéo webcam en temps réel est très fluide et rapide, permettant d'atteindre les 30 fps sans problème !

Pour quoi faire ?

  • Les applications potentielles sont :
    • des applications de réalité augmentée, ce pour quoi la technique a été imaginée
    • mais surtout, en ce qui me concerne, pour une utilisation en robotique permettant d'envisager :
      • des détections avancées de personnes
      • des détections de murs, portes, etc.. avec virtualisation de l'espace 3D associé, le tout en temps réel

Etat des lieux de l'existant

ARToolkit sous Processing = la librairie nyar4psg !

Mon choix = la librairie nyar4psg !

  • La meilleure option que j'ai trouvée pour utiliser ARToolkit dans Processing est la librairie java NyARToolkit qui dispose d'un "port" pour Processing !! Que demande le peuple ?!
  • NyARToolKit : librairie Java de ARTOOLKit (site japonais) http://nyatla.jp/nyartoolkit/wp/?page_id=198 Le TOP : existe en librairie Processing : http://nyatla.jp/nyartoolkit/wp/?page_id=357 A priori, le plus facile à mettre en oeuvre dans Processing... !!
  • Bien qu'elle soit écrite en Java, cette librairie est étonnamment rapide en exécution !

Tutoriel / exemple :

Installation

Pré-requis :

  • Evidemment Processing 1-5
  • Et aussi la librairie GSVideo (pour la capture vidéo !)

Obtenir et imprimer des "markers"

Dans une première approche

  • Pour avoir les exemples de patterns (et pour créer des « Markers ») voir : http://www.cs.utah.edu/gdc/projects/augmentedreality/ et télécharger le fichier... Les « markers » ou « pattern » (une centaine ), sont dans le rép ~/Téléchargement/paternMaker/examples/gif
  • Sélectionner Pattern de son choix et l'imprimer. Exemple ici avec le "marker" 99 :

Créer des markers ?

  • Pour faire ses propres pattern ? Voir le « readMe » dans /patternMaker/doc/ Il existe un prog exécutable en Java et C

Infos technique sur les markers

Principe général d'un programme Processing utilisant ARToolkit avec la librairie nyar4psg et Javacvpro :

Inclure les fichiers de librairies utiles :

import codeanticode.gsvideo.*; // importe la librairie vidéo GSVideo
import monclubelec.javacvPro.*; // importe la librairie javacvPro
import jp.nyatla.nyar4psg.*; // the NyARToolkit Processing library

import java.awt.*; // Classe Point, Rectangle , etc...
 

Déclarations :

On déclare un objet MultiTracker qui va contenir les informations de description des markers à rechercher et va servir de base pour la détection des markers dans l'image :

MultiMarker nya;

On déclare les autres objets utiles :


GSCapture cam; // déclare un objet GSCapture représentant une webcam

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

PMatrix3D syst3D; // déclare une matrice 4x4 représentant un système de coordonnées 3D..
 

On déclare également les chemins nécessaires pour la configuration de l'objet MultiMarker :

//----- chemin absolu fichier de paramètres de distorsion de la camera ----
//String camParamPath = "/home/hinault/Téléchargements/librairies_processing/nyar4psg-1.1.6/data/camera_para.dat";
String camParamPath = "/home/xavier/Téléchargements/processing-1.5/modes/java/libraries/NyAR4psg/data/camera_para.dat";
// utilise le fichier par défaut - donne résultat satisfaisant

//----- chemin absolu fichiers de description des patterns ou markers ----
String patternPath = "/home/xavier/Téléchargements/patternMaker/examples/ARToolKit_Patterns";
// à télécharger ici : http://www.cs.utah.edu/gdc/projects/augmentedreality/

On déclare enfin un tableau d'objet Marker (JavacvPro) qui va contenir toutes les informations utiles issues de la détection des markers. L'objet Marker fait le pont en quelque sorte entre les librairies Javacvpro et Nyar4Psg

Marker[] markersArray = new Marker[numMarkers]; // tableau pour stockage des paramètres des markers détectés avec ARToolkit - classe javacvPro !

Setup

On initialise l'objet MultiMarker;, le tableau d'objet Marker et on charge le nombre voulu de fichiers de pattern à rechercher que l'on ajoute à l'objet MultiMarker :


     //=========== initialisation détection des markers =========================

     // création d'un objet MultiMarker avec résolution voulue, les paramètres caméra et le système de coordonnées voulu
        nya = new MultiMarker(this, widthAR, heightAR, camParamPath, NyAR4PsgConfig.CONFIG_DEFAULT);

   // fixe le nombre de fois qu'un marqueur ne doit plus etre détecté pour ne plus l'afficher.
     //Par défaut = 10. Mettre à 1 pour visualisation immédiate
      nya.setLostDelay(1);

      // fixe le niveau de seuil de détection à utiliser. Valeur possible entre 0 et 255. Mettre -1 (=THLESHOLD_AUTO) pour seuil automatique - respecter la "faute"
        nya.setThreshold(MultiMarker.THLESHOLD_AUTO);

        // fixe le niveau de seuil de confiance (= probabilité de correspondance) à utiliser pour la reconnaissance des markers. Valeur possible entre 0 et 1.
        // Valeur par défaut = 0.51 (=.DEFAULT_CF_THRESHOLD). Plus le seuil est élevé et plus la détection est rigoureuse.
        nya.setConfidenceThreshold(MultiMarker.DEFAULT_CF_THRESHOLD);
        //nya.setConfidenceThreshold(0.8); // sélection exigeante

        //-- chargement des fichiers de description des patterns

        //------- création des objets Marker individuel du tableau de markers (javacvPro)
        // et initialisation des propriétés communes
        for (int i=0; i<markersArray.length; i++) {
          markersArray[i]=new Marker();
          markersArray[i].realWidth=realWidthMarker;
        } // fin for

        //-------- initialisation du tableau d'objets marker (javacvPro)
        // chaque objet Marker de la librairie javacvPro contient les paramètres attachés au marker nyar correspondant
        // son nom = le fichier de description *.patt
        markersArray[0].name="4x4_99.patt"; // mémorise le nom du fichier du marker voulu
        markersArray[1].name="4x4_50.patt"; // mémorise le nom du fichier du marker voulu
        markersArray[2].name="4x4_83.patt"; // mémorise le nom du fichier du marker voulu
        markersArray[3].name="4x4_23.patt"; // mémorise le nom du fichier du marker voulu
        markersArray[4].name="4x4_68.patt"; // mémorise le nom du fichier du marker voulu
        markersArray[5].name="4x4_76.patt"; // mémorise le nom du fichier du marker voulu
        markersArray[6].name="4x4_55.patt"; // mémorise le nom du fichier du marker voulu
        markersArray[7].name="4x4_34.patt"; // mémorise le nom du fichier du marker voulu
        // etc...

        //---- chargement des markers dans le MultiMarker (nyartoolkit)---
        for (int i=0; i<markersArray.length; i++) {
          nya.addARMarker(patternPath + "/" + markersArray[i].name, markersArray[i].realWidth); // ajoute le fichier de description à l'objet principal de détection AR - bordure 25% et 16x16 par défaut
          println ("Fichier chargé : " + markersArray[i].name);
        } // fin for
 

Draw :

  • On detect les pattern dans l'image :
nya.detect(image); // detect markers in the input image at the correct resolution (incorrect resolution will give assertion error)
  • Ensuite, on met à jour le tableau d'objet Marker avec la fonction Javacvpro updateMarker() :
opencv.updateMarkers(nya, markersArray, false); // met à jour le tableau des paramètres 2D des markers - javacvPro
  • Dès lors, on peut appeler toutes les fonctions utiles JavacvPro pour la gestion et l'affichage des Markers notamment :
    • isMarkerExist() : test si un Marker est présent dans l'image
    • selectMarker() : sélectionne un Marker
    • distanceMarker() : calcule la distance d'un Marker
    • distanceMarkers() : calcule la distance pour tous les Markers d'un tableau de Markers
    • draw2DMarkers() : dessine le Marker en 2D sur l'image
    • draw3DMarkers() : dessine le repère 3D du Marker

Se reporter aux programmes d'exemple des différentes fonctions pour plus de détails.

  • Noter également que l'objet Marker donne accès à de nombreuses informations pour chaque Marker détecté. Une instance de la classe Marker regroupe :
    • le nom du fichier de description du marker
    • abscisse réelle au sol de l'espace d'évolution décrit par les markers
    • ordonnée réel au sol de l'espace d'évolution décrit par les markers
    • largeur réelle du Marker
    • largeur 2D du Marker telle que affichée sur l'image webcam
    • hauteur 2D du Marker telle que affichée sur l'image webcam
    • milieu bord sup 2D du marqueur
    • milieu bord inf 2D du marqueur
    • milieu bord gauche 2D du marqueur
    • milieu bord droit 2D du marqueur
    • centre 2D du marqueur
    • tableau des points des coins 2D du marqueur
    • largeur 3D du Marker telle que affichée sur l'image webcam
    • hauteur 3D du Marker telle que affichée sur l'image webcam
    • profondeur 3D du Marker telle que affichée sur l'image webcam
    • distance du marker à la webcam (calculée)
    • angle de rotation dans l'axe Y en degrés

Trucs techniques de mise en oeuvre :

  • utiliser des markers 4x4 suffit et donne un bon degré de robustesse et permet de réaliser potentiellement 256 markers différents (16²) ...
  • utiliser des markers ayant une bonne alternance de blancs/noir qui semblent donner un meilleur taux de confiance de détection.

Commentaires utilisateurs

Aucun

Cette page est une création originale de Xavier HINAULT - Tous droits réservés - 2011/2012