// Programme processing
// généré avec le générateur de code Processing
// du site www.mon-club-elec.fr
// par X. HINAULT - tous droits réservés
// Programme écrit le : 29/2/2012.
// ------- Licence du code de ce programme : GPL v3-----
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License,
// or any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
/////////////// Description du programme ////////////
// Utilise la librairie GSVideo de capture et lecture vidéo
// Utilise la librairie javacvPro de traitement d'image et reconnaissance visuelle
// Utilise la librairie nyar4psg qui implémente ARToolkit dans Processing
/*
Détection du centre et du type d'un marker ARToolkit
*/
// XXXXXXXXXXXXXXXXXXXXXX ENTETE DECLARATIVE XXXXXXXXXXXXXXXXXXXXXX
// inclusion des librairies utilisées
import codeanticode.gsvideo.*; // importe la librairie vidéo GSVideo qui implémente GStreamer pour Processing (compatible Linux)
// librairie comparable à la librairie native vidéo de Processing (qui implémente QuickTime..)- Voir Reference librairie Video Processing
// cette librairie doit être présente dans le répertoire modes/java/libraries du répertoire Processing (1-5)
// voir ici : http://gsvideo.sourceforge.net/
// et ici : http://codeanticode.wordpress.com/2011/05/16/gsvideo-09-release
import monclubelec.javacvPro.*; // importe la librairie javacvPro qui implémente le traitement d'image avancé et la reconnaissance visuelle pour Processing
// cette librairie se base sur les fonctions java de la librairie javacv par Samuel Audet : http://code.google.com/p/javacv/
// javacv implémente en Java les centaines de fonctions natives de la librairie OpenCV (2500 algorithmes) !
// la librairie javacvPro doit être présente dans le répertoire modes/java/libraries du répertoire Processing (1-5)
// dispo ici : http://www.mon-club-elec.fr/pmwiki_reference_lib_javacvPro/pmwiki.php
// nécessite également que la librairie native OpenCV 2.3.1 soit installée sur votre ordinateur
// NB : compatibilité avec la plupart des fonctions de la librairie OpenCV pour Processing : http://ubaa.net/shared/processing/opencv/
import java.awt.*; // Classe Point, Rectangle , etc...
import jp.nyatla.nyar4psg.*; // La librairie NyARToolkit Processing library = ARToolKit pour Processing
// Cette librairie permet de détecter des pattern ou marker dans une image
// et d'analyser leur transformation de perspective
// nyAR4psg est à télécharger ici : http://sourceforge.jp/projects/nyartoolkit/releases/
// et à mettre dans le répertoire des librairies
// à noter : javacvPro intègre des fonctions utilisables directement avec nyar4psg
// déclaration objets
PImage imgSrc, imgDest; // déclare un/des objets PImage (conteneur d'image Processing)
GSCapture cam; // déclare un objet GSCapture représentant une webcam
// L'objet GSCapture étend PImage - se comporte comme un conteneur des frames issues de la 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..
MultiMarker nya; // déclaration de l'objet principal pour reconnaissance des markers - nya pour nyArtoolkit
// déclaration variables globales
//------ déclaration des variables de couleur utiles ----
int jaune=color(255,255,0);
int vert=color(0,255,0);
int rouge=color(255,0,0);
int bleu=color(0,0,255);
int noir=color(0,0,0);
int blanc=color(255,255,255);
int bleuclair=color(0,255,255);
int violet=color(255,0,255);
// variable pour la taille de la capture video
int widthCapture=320*2; // largeur capture
int heightCapture=240*2; // hauteur capture
int fpsCapture=15; // framerate (image/secondes) pour la capture video
// NB : pour la détection des markers, on peut utiliser une grande résolution facilement.
// Le résultat sera quand même rapide... et la précision plus élevée.
//----- variables pour calibration webcam -----
float ouvertureX=19.43; // ouverture largeur en degres - Hercules DualPix Exchange
//float ouvertureX=22.53; // ouverture largeur en degres - Logitech C270
// calculé avec tan angle= largeur réelle / 2 * distance camera
// exemple Logitech C270 : 1/2 largeur réelle = 83cm distance = 200 cm
// d'où tan angle = 0.415 et d'où angle = 22.53 deg
//--------- variables pour reconnaissance des Markers avec nyARToolkit ---------------------
//----- 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/
//--- taille de l'image à utiliser pour la détection = plus petite pour plus rapide ---
int widthAR= widthCapture;
int heightAR=heightCapture;
int numMarkers = 8; // le nombre de pattern ou markers différents à utiliser
Marker[] markersArray = new Marker[numMarkers]; // tableau pour stockage des paramètres des markers détectés avec ARToolkit - classe javacvPro !
float realWidthMarker=50; // taille réelle du marker utilisé en mmm - on aura un correspondance 1 mm = 1 pixel ou cran dans le repère 3D du marker
//String[] nameMarkers= new String[numMarkers]; // pour mémoriser le nom des marker
// XXXXXXXXXXXXXXXXXXXXXX Fonction SETUP XXXXXXXXXXXXXXXXXXXXXX
void setup(){ // fonction d'initialisation exécutée 1 fois au démarrage
// ---- initialisation paramètres graphiques utilisés
colorMode(RGB, 255,255,255); // fixe format couleur R G B pour fill, stroke, etc...
fill(0,0,255); // couleur remplissage RGB - noFill() si pas de remplissage
stroke (0,0,255); // couleur pourtour RGB - noStroke() si pas de pourtour
rectMode(CORNER); // origine rectangle : CORNER = coin sup gauche | CENTER : centre
imageMode(CORNER); // origine image : CORNER = coin sup gauche | CENTER : centre
ellipseMode(CENTER); // origine cercles / ellipses : CENTER : centre (autres : RADIUS, CORNERS, CORNER
//strokeWeight(0); // largeur pourtour
frameRate(30);// Images par seconde - The default rate is 60 frames per second
// --- initialisation fenêtre de base ---
size(widthCapture,heightCapture,P3D); // ouvre une fenêtre xpixels x ypixels - 3D active
background(0,0,0); // couleur fond fenetre
// --- initialisation des objets et fonctionnalités utilisées ---
//======== Initialisation Objets GSVideo (capture et/ou lecture video =========
// GSCapture(this, int requestWidth, int requestHeight, [int frameRate], [String sourceName], [String cameraName])
// cam1 = new GSCapture(this, widthCapture, heightCapture,fpsCapture,"v4l2src","/dev/video0"); // Initialise objet GSCapture désignant webcam - avant GSVideo 1.0
cam = new GSCapture(this, widthCapture, heightCapture,"v4l2src","/dev/video1", fpsCapture); // Initialise objet GSCapture désignant webcam - depuis GSVideo 1.0
// largeur et hauteur doivent être compatible avec la webcam - typiquement 160x120 ou 320x240 ou 640x480...
// Meilleurs résultats avec framerate webcam entre 20 et 30 et frameRate programme idem ou multiple plus grand (40 pour 20 par ex)
// la liste des webcam installées sous Ubuntu (Gnu/Linux) est donnée par la commande : ls /dev/video*
// cam1.play(); // démarre objet GSCapture = la webcam - version GSVideo avant 0.9
cam.start(); // démarre objet GSCapture = la webcam - version GSVideo après 0.9
//======== Initialisation Objets OpenCV (librairie javacvPro : traitement d'image et reconnaissance visuelle) =========
opencv = new OpenCV(this); // initialise objet OpenCV à partir du parent This
opencv.allocate(widthCapture,heightCapture); // crée les buffers image de la taille voulue
//=========== 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