Ce premier projet sous Processing est une mise en relation de l'utilisation de la webcam et de la librairie Control P5 + librairie processing video, afin de créer des effets visuels applicables à une image caméra. L'utilisateur peut donc appliquer différents filtres sur l'image caméra via des boutons de type knob (rotatif) qui permettent d'accentuer l'intensité de chaque filtre, et permettent également la superposition des filtres. De plus, il est possible pour l'utilisateur de générer des captures d'images en appuyant sur la touche ENTER. Ce programmme a été réalisé dans l'esprit de la référence GAZE sur Chrome Experiment.
/* Alycia Rainaud Premier test pour un programme webcam/control p5 À améliorer = diversité des filtres */ import processing.video.*; //Importer la librairie video import controlP5.*; // Importer la librairie controlP5 interfaces graphiques // Initialisation des variables ControlP5 controlP5; // Déclarer la variable controlP5 Capture cam; // Déclarer la variable caméra color c; // Déclarer la variable color // Attributs des boutons control P5 int myColorBackground = color(0,0,0); // Couleur de fond de base int knobValue = 100; // Valeur du bouton knob 1 int knobValue2 = 100; // Valeur du bouton knob 2 int knobValue3 = 100; // Valeur du bouton knob 3 Knob myKnobA; // Déclarer l'objet KnobA Knob myKnobB; // Déclarer l'objet KnobB Knob myKnobC; // Déclarer l'objet KnobC // Initialisation des paramètres d'affichages void setup() { size(640,480); // Taille de la fenêtre d'affichage smooth(); // Lissage noStroke(); // Pas de contour controlP5 = new ControlP5(this); // Création d'une nouvelle interface Control P5 //controlP5.addKnob("knob",0, 360, 0, 10,10,50); // création d'un bouton pitch //controlP5.addToggle("toggle", true, 160,10,50,50); // création d'un bouton ouvert ou eteint //controlP5.addSlider("slider",0, 255, 123, 240, 10,50,20); // création d'une barre slide de valeurs // Constructeur de Paramétrage du premier Bouton Knob myKnobA = controlP5.addKnob("knobValue") .setRange(0,255) // Détermination du segment de valeur compris entre 0 et 255 .setValue(60) // Détermination de la valeur initiale à l'affichage .setPosition(510,50) // Position du bouton dans la fenêtre d'affichage .setRadius(40) // Diamètre du bouton .setDragDirection(Knob.VERTICAL) // Détermination du mouvement bouton à la verticale ; // Constructeur de Paramétrage du deuxième Bouton Knob myKnobB = controlP5.addKnob("knobValue2") .setRange(0,255) // Détermination du segment de valeur compris entre 0 et 255 .setValue(150) // Détermination de la valeur initiale à l'affichage .setPosition(510,200) // Position du bouton dans la fenêtre d'affichage .setRadius(40) // Diamètre du bouton .setDragDirection(Knob.VERTICAL) // Détermination du mouvement bouton à la verticale ; // Constructeur de Paramétrage du troisième Bouton Knob myKnobC = controlP5.addKnob("knobValue3") .setRange(0,255) // Détermination du segment de valeur compris entre 0 et 255 .setValue(60) // Détermination de la valeur initiale à l'affichage .setPosition(510,350) // Position du bouton dans la fenêtre d'affichage .setRadius(40) // Diamètre du bouton .setDragDirection(Knob.VERTICAL) // Détermination du mouvement bouton à la verticale ; // Affichage caméra String[] cameras = Capture.list(); if (cameras.length == 0) { // Initialisation d'une boucle if println("There are no cameras available for capture."); // Si pas de caméra disponible exit(); // alors fin du programme } else { // cas contraire println("Available cameras:"); // si caméra disponible for (int i = 0; i < cameras.length; i++) { // alors incémentation de la caméra println(cameras[i]); } cam = new Capture(this, width, height); // création d'une nouvelle image caméra cam.start(); // démarage de la caméra } } // Initialisation des boucles d'affichages void draw() { background(myColorBackground); // couleur du fond if (cam.available() == true) { // initialisation de la boucle d'affichage caméra cam.read(); // lecture de la caméra } image(cam, 0, 0); // Boucle d'oscillation du rendu visuel appliqué au Knob A for (int i = 0; i < 640; i = i+2) { // largeur for (int j = 0; j < 480; j = j+2) { // longueur fill(cam.get(i, j)*10,knobValue); // Remplir 10 fois les valeurs i et j rect(i, j, 2,2); // carrés } } // Boucle d'oscillation du rendu visuel appliqué au Knob B for (int i = 0; i < 640; i = i+2) { // largeur for (int j = 0; j < 480; j = j+2) { // longueur fill(cam.get(i, j),knobValue2); // Remplir les valeurs i et j tint(random(255), random(255), random(255), knobValue2); // filtre de couleur aléatoire } } // Boucle d'oscillation du rendu visuel appliqué au Knob C for (int i = 0; i < 640; i = i+2) { // largeur for (int j = 0; j < 480; j = j+2) { // longueur fill(cam.get(i, j)/20,knobValue3); // Remplir les valeurs i et j divisé par 40 rect(i, j, 2,2); // carrés } } } // Méthode pour Prendre une photo en appuyant sur la touche ENTER void keyPressed() { if (key == ENTER) { // si la touche ENTER est pressée saveFrame("image-"+hour()+minute()+second()+".png"); // alors enregistrement de l'image avec pour nom d'image heure minute et seconde au format png } } // FIN DU PROGRAMME //
Ce second projet sous Processing est une mise en relation de l'utilisation de la webcam et de marqueurs papier, pour créer de la réalitée augmentée de façon assez simple et générale. Ici, on retrouve l'utilisation de la librairie processing video (webcam), de la librairie Nyar4PSG (réalité augmentée), la librairie OBJLoader (models 3D) et la librairie OPENGL. Ce programme permet à l'utilisateur de faire apparaitre des objets 2D, 3D etc, lorsqu'il passe le marqueur devant sa caméra. Ce programme est intéressant à développer, en vue d'un prototypage de livre augmenté par exemple.
/* Alycia Rainaud Premier test pour un programme de réalité augmentée. Gestion de plusieurs marqueurs À régler : importation des textures à revoir */ import processing.video.*; // Importer la librairie Vidéo, permet d'appeler la webcam par exemple import jp.nyatla.nyar4psg.*; // Importer la librairie Nyar4Psg, permet la réalité augmentée import saito.objloader.*; // Impporter la librairie OBJLoader, permet d'importer des objets 3D import processing.opengl.*; // Importer la librairie OPENGL, permet de gérer la 3D et les rendus de textures etc // Déclaration des attributs du programme Capture cam; // Déclaration de la variable caméra MultiMarker nya; // Déclaration de la variable Nyar OBJModel model; // Déclaration de la variable objet model // Variables à utiliser lorsque l'import de texture marche //boolean bTexture = false; //boolean bStroke = false; //boolean bMaterial = false; // Méthode d'initialisation des paramètres d'affichages void setup() { size(640,480,P3D); // Taille de la fenêtre + appel de la 3D colorMode(RGB); // Mode colorimétrique cam=new Capture(this,width,height); // Taille de la caméra // Appel de la fonction MultiMarker (reconnaissance multiples des marqueurs) nya=new MultiMarker(this,width,height,"camera_para.dat",new NyAR4PsgConfig(NyAR4PsgConfig.CS_RIGHT_HAND,NyAR4PsgConfig.TM_NYARTK)); nya.addARMarker("patt.hiro",80); // Marqueur 1 + taille nya.addARMarker("patt.kanji",80); // Marqueur 2 + taille nya.addARMarker("4x4_1.patt",80); // Marqueur 3 + taille // Appel d'un modèle 3D format .obj créé dans blender model = new OBJModel(this, "data/circle.obj", "absolute", TRIANGLES); // Création d'un nouvel objet appelé model, instancié par OBJModel model.enableDebug(); // fonction de débug model.scale(20); // taille de l'objet model.translateToCenter(); // Centrer l'objet sur le marqueur } // Méthode d'initialisation des boucles d'affichages void draw() { // Vérification de l'activation de la caméra if (cam.available() !=true) { return; } background(0); // !!! si cette ligne est supprimée, on peut dessiner avec l'objet du marqueur cam.read(); // Lecture de l'image caméra nya.drawBackground(cam); // Applique l'image de la caméra en fond nya.detect(cam); // Detection des marqueurs via la caméra // Boucles de vérifications des marqueurs // Premier marqueur if(nya.isExistMarker(0)){ // Si la caméra detecte un marqueur via Nyar nya.beginTransform(0); // Alors Nyar créé ou applique une transformation { // Apparition d'un cube fill(0,0,255); // Remplir de bleu translate(0,0,20); translate(0,0,-20); box(40); // Dessin d'un cube de 40px } nya.endTransform(); // Si Nyar ne détecte pas de marqueur alors il ne se passe rien } // Deuxième marqueur if(nya.isExistMarker(1)){ // Si la caméra detecte un marqueur via Nyar nya.beginTransform(1); // Alors Nyar créé ou applique une transformation { pushStyle(); model.draw(); // Dessin de l'objet model lights(); popStyle(); // À note : problème d'importation de textures à régler } nya.endTransform(); // Si Nyar ne détecte pas de marqueur alors il ne se passe rien } // Troisième marqueur if(nya.isExistMarker(2)){ // Si la caméra detecte un marqueur via Nyar nya.beginTransform(2); // Alors Nyar créé ou applique une transformation { // Apparition d'une sphère fill(255,255,0); // Remplir de jaune translate(0,0,30); translate(0,0,-30); sphere(30); // Dessin d'une sphere de 30px } nya.endTransform(); // Si Nyar ne détecte pas de marqueur alors il ne se passe rien } } // FIN DU PROGRAMME //