Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// partage de liens //// une carte des membres//// (apéros) codelab


#1 2017-05-04 17:39:30 Aide pour un pour projet artistique sur Processing

Sofyan
membre
Date d'inscription: 2017-04-06
Messages: 13

Aide pour un pour projet artistique sur Processing



Salut à tous-tes ! big_smile

Je suis étudiant en art à Genève et je m’intéresse pas mal à l'art numérique et au potentiel de la programmation dans le cadre d'installation contemporaine lier à l'image, seulement voilà... Je commence à peine à limer des logiciels tel que Processing ou encore Maxmsp et suis encore un peu une brelle en la matière hmm
Je fais donc appel à vous pour me conseiller sur le projet que je souhaite réaliser prochainement.

Je souhaite réaliser une pièce constituer d'une imprimante, posée au centre d'une pièce. La scène serait filmé en permanence par une caméra. Je veux que l'imprimante débite du papier en réaction à un stimuli vidéo tel qu'un changement de couleur ou de luminosité, voire un mouvement, de sorte que dès qu'une personne entre dans la salle, l'imprimante commence à imprimer en boucle une image prédéfini en fonction de ce que la caméra détecte, ou encore, idéalement un screenshot du flux vidéo.

J'arrive à faire en sorte que Processing détecte une couleur plus ou moins précise sur une surface donnée de mon flux vidéo mais je n'arrive pas à lui donner pour commande de prendre un screenshot de ce que la caméra filme et d'imprimer ce qui est dans le presse-papier.

Dans le cas où je souhaite que Processing imprime une image donnée en fonction de ce qu'il détecte, j'ai pensé à programmer un macro sur LibreOffice lui ordonnant de lancer une impression à l'ouverture puis de se refermer, le fichier à ouvrir dépendant de ce qui est détecté. Mais là je n'arrive pas à dire à Processing d'ouvrir un fichier du coup hmm

On m'a conseillé d'utiliser Maxmsp pour ce type de tâche, ce dernier étant apparemment plus facile d'accès, mais ayant déjà une vague idée de ce qui est faisable sur Processing, et surtout car ayant déjà commencé à travailler un peu dessus, je voulais vraiment être sûre que je ne pouvais rien faire avec.

Voici le code que j'ai utilisé pour détecter des couleur dans un premier temps:


import processing.video.*;

Capture cam;

// tracking position
int xpos = 320;
int ypos = 240;

float redPixela;
float greenPixela;
float bluePixela;

float redPixelb;
float greenPixelb;
float bluePixelb;

float redPixelc;
float greenPixelc;
float bluePixelc;

float circle;

void setup() {
  size(640, 480);

  String[] cameras = Capture.list();
  
  if (cameras.length == 0) {
    println("There are no cameras available for capture.");
    exit();
  } else {
    println("Available cameras:");
    for (int i = 0; i < cameras.length; i++) {
      println(cameras[i]);
    }
    
    // The camera can be initialized directly using an 
    // element from the array returned by list():
    cam = new Capture(this, cameras[0]);
    cam.start();     
  }      
}

void draw() {
  if (cam.available() == true) 
  {
    cam.read();
  }
  image(cam, 0, 0);
  
  // track spot
  // check the color of the tracking position and write it to screen
  
  
  color a= cam.get (xpos-200, ypos-2);
 float redPixela = red(a);
 float greenPixela = green(a);
 float bluePixela = blue(a);


 if(redPixela > greenPixela && redPixela > bluePixela)
 
 {
      text("Salut !", xpos-200, ypos-2, 2); textSize(50);
 }
  
 
  color b = cam.get (xpos-2, ypos-2);
 float redPixelb= red(b);
 float greenPixelb= green(b);
 float bluePixelb= blue(b);

  if(greenPixelb > redPixelb && greenPixelb > bluePixelb)
 {
      text("ca", xpos-2, ypos-2, 2000); textSize(50);
      
 }
 
 
  color c= cam.get (xpos+200, ypos-2);
 float redPixelc= red(c);
 float greenPixelc= green(c);
 float bluePixelc= blue(c);
  
   if(bluePixelc > greenPixelc && bluePixelc > redPixelc)
 {
      text("va ?", xpos+200, ypos-2); textSize(50);
 }
 
  // draw the tracking positions
  rect (xpos-200, ypos-2, 10, 10);
  rect (xpos-2, ypos-2, 10, 10);
  rect (xpos+200, ypos-2, 10, 10);
 

}

En espérant avoir été clair et pas trop profane, je vous remercie d'avoir pris le temps de me lire et peut-être de me répondre !big_smile

Hors ligne

 

#2 2017-05-05 12:53:07 Re : Aide pour un pour projet artistique sur Processing

matthieu
membre
Date d'inscription: 2008-06-09
Messages: 193

Re: Aide pour un pour projet artistique sur Processing



Tu as déjà lu ce post ? : http://codelab.fr/6562

Pour l'image tu pourrais la sauver avec cette fonction : https://processing.org/reference/save_.html
Puis l'imprimer avec ce qui est décrit dans le post ci-dessus.


Ce que vous avez fait au plus petit de mes frères, c'est à moi que vous l'avez fait.

Hors ligne

 

#3 2017-05-06 22:14:24 Re : Aide pour un pour projet artistique sur Processing

Sofyan
membre
Date d'inscription: 2017-04-06
Messages: 13

Re: Aide pour un pour projet artistique sur Processing



Salut mathieu !

Merci pour ta réponse, je vais checker ça !

Hors ligne

 

#4 2017-05-06 23:37:06 Re : Aide pour un pour projet artistique sur Processing

Sofyan
membre
Date d'inscription: 2017-04-06
Messages: 13

Re: Aide pour un pour projet artistique sur Processing



Alors, j'ai réussi à enregistrer les screen dans la librairie, mais je n'arrive pas à lancer une impression dès l'apparition des images... D'ailleurs, j'avoue avoir un pu de mal à comprendre comment adapter le code que j'ai trouvé dans le post que tu m'a relayé plus haut hmm

J'ai fait quelques recherches et ai essayé ça :



import processing.video.*;

Capture cam;

// tracking position
int xpos = 320;
int ypos = 240;

float redPixela;
float greenPixela;
float bluePixela;

float redPixelb;
float greenPixelb;
float bluePixelb;

float redPixelc;
float greenPixelc;
float bluePixelc;

float circle;

void setup() {
  size(640, 480);

  String[] cameras = Capture.list();
 
  if (cameras.length == 0) {
    println("There are no cameras available for capture.");
    exit();
  } else {
    println("Available cameras:");
    for (int i = 0; i < cameras.length; i++) {
      println(cameras[i]);
    }
   
    // The camera can be initialized directly using an
    // element from the array returned by list():
    cam = new Capture(this, cameras[0]);
    cam.start();     
  }     
}

void draw() {
  if (cam.available() == true)
  {
    cam.read();
  }
  image(cam, 0, 0);
 
  // track spot
  // check the color of the tracking position and write it to screen
 
 
  color a= cam.get (xpos-200, ypos-2);
float redPixela = red(a);
float greenPixela = green(a);
float bluePixela = blue(a);


if(redPixela > greenPixela && redPixela > bluePixela)

{
      save("test.jpg");
}
 

  color b = cam.get (xpos-2, ypos-2);
float redPixelb= red(b);
float greenPixelb= green(b);
float bluePixelb= blue(b);

  if(greenPixelb > redPixelb && greenPixelb > bluePixelb)
{
      save("test1.jpg");
       try java.awt.Desktop.getDesktop().print(File("test1.jpg"));
     
}


  color c= cam.get (xpos+200, ypos-2);
float redPixelc= red(c);
float greenPixelc= green(c);
float bluePixelc= blue(c);
 
   if(bluePixelc > greenPixelc && bluePixelc > redPixelc)
{
      save("test2.jpg");
}

  // draw the tracking positions
  rect (xpos-200, ypos-2, 10, 10);
  rect (xpos-2, ypos-2, 10, 10);
  rect (xpos+200, ypos-2, 10, 10);

}}

Mais rien à faire...

Dernière modification par Sofyan (2017-05-06 23:38:04)

Hors ligne

 

#5 2017-05-07 12:09:10 Re : Aide pour un pour projet artistique sur Processing

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 743

Re: Aide pour un pour projet artistique sur Processing



Bonjour,

Tu oublies plein de trucs dans l'intégration pour l'impression.
Il est préférable de construire une méthode que tu appelles chaque fois que tu en as besoin.
Voici un exemple avec un flux vidéo.

import java.awt.Desktop;
import processing.video.*;

Capture video;

void setup() {
  size(640, 480);
  video = new Capture(this, 640, 480);
  video.start();
}

void draw() {
  image(video, 0, 0);
}

void captureEvent(Capture c) {
  c.read();
}

void keyPressed() {
  impression(video);
}

void impression(PImage imago) {
  imago.save("Impression.jpg");
  if (Desktop.isDesktopSupported()) {  
    if (Desktop.getDesktop().isSupported(java.awt.Desktop.Action.PRINT)) {  
      try {  
        java.awt.Desktop.getDesktop().print(new File(savePath("") + "Impression.jpg"));
      }  
      catch (IOException ex) {  
        //Traitement de l'exception
      }
    } else {  
      println("La fonction n'est pas supportee par votre systeme d'exploitation");
    }
  } else {  
    println("Desktop pas supporte par votre systeme d'exploitation");
  }
}

Hors ligne

 

#6 2017-05-07 19:12:27 Re : Aide pour un pour projet artistique sur Processing

Sofyan
membre
Date d'inscription: 2017-04-06
Messages: 13

Re: Aide pour un pour projet artistique sur Processing



Merci Mushussu, ça marche !

J'ai adapté un peu l'histoire et il enregistre et lance l'impression des screens à la détection d'une couleur.
J'ai seulement deux problèmes qui persistent et que je n'arrive pas à arranger:

En reprenant ton exemple j'arrive à lancer le process en appuyant sur Espace, les screens/impressions se faisant en continu si il détecte la couleur prévu en même temps, mais je n'arrive pas à faire en sorte que la couleur soit le seul déclencheur, afin qu'il lance les screens/impressions à la détection de ma couleur, qu'il s'arrête si elle n'y est plus, se relance quand elle y est de nouveau etc... Bref un simili détecteur de mouvement.

import java.awt.Desktop;
import processing.video.*;

Capture cam;

int xpos = 320;
int ypos = 240;

float redPixela;
float greenPixela;
float bluePixela;

float circle;

void setup() {
  size(640, 480);

  String[] cameras = Capture.list();
  
  if (cameras.length == 0) {
    println("There are no cameras available for capture.");
    exit();
  } else {
    println("Available cameras:");
    for (int i = 0; i < cameras.length; i++) {
      println(cameras[i]);
    }

    cam = new Capture(this, cameras[0]);
    cam.start();     
  }      
}

void draw() {
  if (cam.available() == true) 
  {
    cam.read();
  }
  image(cam, 0, 0);}


void captureEvent(Capture c) {
  c.read();
}

void keyPressed() { 
  impression(cam);
}

  
void impression(PImage imago) {
  imago.save("Impression.jpg");
  
  if (Desktop.isDesktopSupported()) {  
    if (Desktop.getDesktop().isSupported(java.awt.Desktop.Action.PRINT)) {  
      try {  
        java.awt.Desktop.getDesktop().print(new File(savePath("") + "Impression.jpg"));
      }  
      catch (IOException ex) {  
        //Traitement de l'exception
      }
    } else {  
      println("La fonction n'est pas supportee par votre systeme d'exploitation");
    }
  } else {  
    println("Desktop pas supporte par votre systeme d'exploitation");
  }
  
 
  color a= cam.get (xpos-200, ypos-2);
 float redPixela = red(a);
 float greenPixela = green(a);
 float bluePixela = blue(a);


 if(greenPixela > redPixela && greenPixela > bluePixela)
 
 {
   impression(cam);
 }

}

Mon second problème est que l'impression ne se lance pas directement, mais le gestionnaire d'impression, me demandant d'appuyer sur ok pour envoyer le document à l'imprimante. Et j'aurais souhaité qu'elle se lance comme une impression rapide sur LibreOffice, par exemple.
Je n'ai pas encore eu le temps de me pencher sur ce problème, aussi il se peut que ce ne soit qu'une préférence Windows à ajuster, auquel cas, je n'ai rien dit smile



Quoiqu'il en soit, merci à tous de prendre le temps de m'aider !

Dernière modification par Sofyan (2017-05-07 19:15:07)

Hors ligne

 

#7 2017-05-07 23:48:42 Re : Aide pour un pour projet artistique sur Processing

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 743

Re: Aide pour un pour projet artistique sur Processing



Comme dans le post cité plus haut, quel est le visionneur d'images que tu as mis par défaut. Sous Mac, il faut laisser celui d'Apple pour que l'impression se fasse directement.

Sinon, pour le premier point :

import java.awt.Desktop;
import processing.video.*;

Capture cam;

int xpos = 320;
int ypos = 240;

float redPixela;
float greenPixela;
float bluePixela;

float circle;

void setup() {
  size(640, 480);

  String[] cameras = Capture.list();

  if (cameras.length == 0) {
    println("There are no cameras available for capture.");
    exit();
  } else {
    println("Available cameras:");
    for (int i = 0; i < cameras.length; i++) {
      println(cameras[i]);
    }

    cam = new Capture(this, cameras[0]);
    cam.start();
  }
}

void draw() {
  image(cam, 0, 0);

  color a= cam.get (xpos-200, ypos-2);
  float redPixela = red(a);
  float greenPixela = green(a);
  float bluePixela = blue(a);

  if (greenPixela > redPixela && greenPixela > bluePixela) {
    impression(cam);
  }
}

void captureEvent(Capture c) {
  c.read();
}

void impression(PImage imago) {
  imago.save("Impression.jpg");

  if (Desktop.isDesktopSupported()) {  
    if (Desktop.getDesktop().isSupported(java.awt.Desktop.Action.PRINT)) {  
      try {  
        java.awt.Desktop.getDesktop().print(new File(savePath("") + "Impression.jpg"));
      }  
      catch (IOException ex) {  
        //Traitement de l'exception
      }
    } else {  
      println("La fonction n'est pas supportee par votre systeme d'exploitation");
    }
  } else {  
    println("Desktop pas supporte par votre systeme d'exploitation");
  }
}

Hors ligne

 

#8 2017-05-08 09:35:15 Re : Aide pour un pour projet artistique sur Processing

Sofyan
membre
Date d'inscription: 2017-04-06
Messages: 13

Re: Aide pour un pour projet artistique sur Processing



Super merci ! Ca marche parfaitement !

Dernière chose, après je pense pouvoir me débrouiller seul:

je me demandais si il était possible d'avoir un temps de rafraichissement, de sorte qu'il analyse la couleur de l'image toutes les 5 sec., par exemple, et non en continu comme maintenant. En l'état, tout fonctionne parfaitement, mais après un certains temps le nombre excessif d'impression fait planter l'ordi et la vidéo, je n'y avait pas pensé hmm

Hors ligne

 

#9 2017-05-08 10:33:56 Re : Aide pour un pour projet artistique sur Processing

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 743

Re: Aide pour un pour projet artistique sur Processing



Bonjour,

L'impression fonctionne t'elle sans avoir à appuyer sur OK ?

Sinon, voici le code pour que le test se fasse que toutes les cinq minutes :

import java.awt.Desktop;
import processing.video.*;

Capture cam;

int xpos = 320;
int ypos = 240;

float redPixela;
float greenPixela;
float bluePixela;
int compteurTemps;
float circle;

void setup() {
  size(640, 480);

  String[] cameras = Capture.list();

  if (cameras.length == 0) {
    println("There are no cameras available for capture.");
    exit();
  } else {
    println("Available cameras:");
    for (int i = 0; i < cameras.length; i++) {
      println(cameras[i]);
    }

    cam = new Capture(this, cameras[0]);
    cam.start();
  }
  compteurTemps = minute();
}

void draw() {
  image(cam, 0, 0);
  if ((minute() - compteurTemps + 60) % 60 == 5) { // Toutes les cinq minutes
    compteurTemps = minute();
    color a= cam.get (xpos-200, ypos-2);
    float redPixela = red(a);
    float greenPixela = green(a);
    float bluePixela = blue(a);

    if (greenPixela > redPixela && greenPixela > bluePixela) {
      impression(cam);
    }
  }
}

void captureEvent(Capture c) {
  c.read();
}

void impression(PImage imago) {
  imago.save("Impression.jpg");

  if (Desktop.isDesktopSupported()) {  
    if (Desktop.getDesktop().isSupported(java.awt.Desktop.Action.PRINT)) {  
      try {  
        java.awt.Desktop.getDesktop().print(new File(savePath("") + "Impression.jpg"));
      }  
      catch (IOException ex) {  
        //Traitement de l'exception
      }
    } else {  
      println("La fonction n'est pas supportee par votre systeme d'exploitation");
    }
  } else {  
    println("Desktop pas supporte par votre systeme d'exploitation");
  }
}

Hors ligne

 

#10 2017-05-08 14:49:25 Re : Aide pour un pour projet artistique sur Processing

Sofyan
membre
Date d'inscription: 2017-04-06
Messages: 13

Re: Aide pour un pour projet artistique sur Processing



Merci ! Le timer fonctionne sans problème.

Pour ce qui est de l'impression automatique, je n'ai pas encore pu la tester sur mon PC, mais sur Mac tout fonctionne niquel ! je te tiens au courant.

Merci encore pour ton aide !

Hors ligne

 

#11 2017-05-10 15:48:39 Re : Aide pour un pour projet artistique sur Processing

Sofyan
membre
Date d'inscription: 2017-04-06
Messages: 13

Re: Aide pour un pour projet artistique sur Processing



Arf j'ai cherché partout et impossible de trouver comment lancer l'impression rapidement sans passer par le gestionnaire d'impression... Sur le Mac d'un ami, aucun soucis, mais sur mon PC rien à faire...

Hors ligne

 

#12 2017-05-10 17:35:43 Re : Aide pour un pour projet artistique sur Processing

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 743

Re: Aide pour un pour projet artistique sur Processing



Bonjour,

Peux-tu essayer avec ce bout de code juste pour l'impression :

import java.awt.print.*;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import processing.video.*;

Capture video;

void setup() {
  size(640, 480);
  video = new Capture(this, 640, 480);
  video.start();
}

void draw() {
  image(video, 0, 0);
}

void captureEvent(Capture c) {
  c.read();
}

void keyPressed() {
  PrinterJob job = PrinterJob.getPrinterJob();
  /* On donne le contenu a imprimer au job */
  job.setPrintable(new Impression(video));
  try {
    /* Lancement de l'impression */
    job.print();
  }
  catch (PrinterException e1) {
    e1.printStackTrace();
  }
}

public class Impression implements Printable {
  BufferedImage img;

  Impression(PImage _img) {
    img = (BufferedImage) _img.getNative();
  }

  @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
    if (pageIndex > 0) {
      return NO_SUCH_PAGE;
    }

    graphics.drawImage(img, 0, 0, null);

    return PAGE_EXISTS;
  }
}

Dernière modification par Mushussu (2017-05-10 17:43:52)

Hors ligne

 

#13 2017-05-10 18:44:51 Re : Aide pour un pour projet artistique sur Processing

Sofyan
membre
Date d'inscription: 2017-04-06
Messages: 13

Re: Aide pour un pour projet artistique sur Processing



Yes ! Là ça fonctionne

Hors ligne

 

#14 2017-05-10 19:22:17 Re : Aide pour un pour projet artistique sur Processing

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 743

Re: Aide pour un pour projet artistique sur Processing



Le code qui regroupe les différents modules :

import java.awt.print.*;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.OrientationRequested;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import processing.video.*;

Capture cam;

int xpos = 320;
int ypos = 240;

float redPixela;
float greenPixela;
float bluePixela;
int compteurTemps;
float circle;

void setup() {
  size(640, 480);

  String[] cameras = Capture.list();

  if (cameras.length == 0) {
    println("There are no cameras available for capture.");
    exit();
  } else {
    println("Available cameras:");
    for (int i = 0; i < cameras.length; i++) {
      println(cameras[i]);
    }

    cam = new Capture(this, cameras[0]);
    cam.start();
  }
  compteurTemps = minute();
}

void draw() {
  image(cam, 0, 0);
  if ((minute() - compteurTemps + 60) % 60 == 5) { // Toutes les cinq minutes
    compteurTemps = minute();
    color a= cam.get (xpos-200, ypos-2);
    float redPixela = red(a);
    float greenPixela = green(a);
    float bluePixela = blue(a);

    if (greenPixela > redPixela && greenPixela > bluePixela) {
      impression(cam);
    }
  }
}

void captureEvent(Capture c) {
  c.read();
}

void impression(PImage imago) {
  PrinterJob job = PrinterJob.getPrinterJob();
  HashPrintRequestAttributeSet attributsImpression = new HashPrintRequestAttributeSet();
  attributsImpression.add(OrientationRequested.LANDSCAPE);
  job.setPrintable(new Impression(imago));
  try {
    job.print(attributsImpression);
  }
  catch (PrinterException e1) {
    e1.printStackTrace();
  }
}

public class Impression implements Printable {
  PImage img;

  Impression(PImage _img) {
    img = _img;
  }

  @Override 
  public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
    if (pageIndex > 0) {
      return NO_SUCH_PAGE;
    }
    int largeur = (int)pageFormat.getImageableWidth();
    int hauteur = (int)pageFormat.getImageableHeight();
    BufferedImage imago = (BufferedImage) img.getNative();   
    graphics.drawImage(imago, 0, 0, largeur, hauteur, null);
    return PAGE_EXISTS;
  }
}

Dernière modification par Mushussu (2017-05-10 19:24:00)

Hors ligne

 

#15 2017-05-10 21:02:24 Re : Aide pour un pour projet artistique sur Processing

Sofyan
membre
Date d'inscription: 2017-04-06
Messages: 13

Re: Aide pour un pour projet artistique sur Processing



Impèc ! Merci pour tout ! Je manquerai pas de te citer quand je présenterai mon projet fini !
J'ai déjà un peu plus l'impression de comprendre ce que je fais grâce à toi smile

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2017