domenica 27 dicembre 2009

Circular Pixels

In questi ultilimi giorni ho giocato un po' con Processing e Arduino. Nonostante la mia poca esperienza con Processing, i risultati sono stati molto soddisfacenti.
Avvelendomi delle librerie Serial e Video incluse nell'ultima versione sono riuscito con poco sforzo a manipolare i pixel dell'input video della webcam con sei potenziometri collegati ad arduino.






Arduino si limita a prendere i sei valori analogici, ad allinearli in una comoda stringa e a spedire questa stringa via comunicazione seriale.

int anali = 6;
int tolleranza = 9;
int valore[6];
int vecchio[6];

void setup()
{
  Serial.begin(57600);  
}  

void loop()
{
  for (int n = 0; n < anali; n++)
  {
    valore[n] = analogRead(n);
    if (abs(vecchio[n] - valore[n]) > tolleranza)
    {
    vecchio[n] = valore[n];
    for (int i = 0; i < anali; i++)
    {
      Serial.print(valore[i], DEC);
      if (i < (anali - 1))
      {
        Serial.print(",");
      }
    }
    Serial.println();
    }
  }
}

Processing riceve questa stringa, la divide nei singoli valori (i quali sono separati da virgole), e li associa ad alcune divertenti variabili. Allo stesso tempo si collega alla webcam, prende il colore di un pixel ogni tanto e traccia un cerchio di quel colore a quelle coordinate, il risultato finale è un'immagine composta non da punti, ma da cerchi.

import processing.serial.*;
import processing.video.*;
Serial seriale;
Capture videoin;
MovieMaker film;

int x = 400;
int y = 300;
int an0 = 1;
int an1 = 1;
int an2 = 1;
int an3 = 1;
int an4 = 1;
int an5 = 1;


void setup()
{
  size(x, y);
  background(0);
  smooth();
  noFill();

  videoin = new Capture(this, width, height, "Common PixArt PAC207 based webcam (0x2468)", 30);
  film = new MovieMaker(this, width, height, "/Volumes/partio/cpawm7.avi", 30, MovieMaker.BMP, MovieMaker.HIGH);
  
  seriale = new Serial(this, Serial.list()[2], 57600);
  seriale.bufferUntil('\n');
  seriale.clear();
}

void draw()
{ 
  //image(videoin, 0, 0);
    
  color rosso = color(an4, 0, 0);
  color verde = color(0, an5, 0);
  color blu = color(0, 0, an0);
  
  color csum1 = blendColor(rosso, verde, ADD);
  color csum2 = blendColor(csum1, blu, ADD);
  
  int raggio = an1;
  int spazio = an2;
  int opacita = an3;
  
  for (int scany = 0; scany < y; scany = scany + spazio)
  {
    for (int scanx = 0; scanx < x; scanx = scanx + spazio)
    {
      color colore = videoin.get(scanx, scany);
      int colorsum = blendColor(colore, csum2, ADD);
      stroke(colorsum, opacita);
      ellipse(scanx, scany, raggio, raggio);
    }
  }
  film.addFrame();
}

void serialEvent(Serial seriale)
{
  String flusso = seriale.readStringUntil('\n');
  flusso = trim(flusso);
  int quanti[] = int(split(flusso, ','));

  an0 = int(map(quanti[0], 0, 1023, 0, 254));
  an1 = int(map(quanti[1], 0, 1023, 1, 100));
  an2 = int(map(quanti[2], 0, 1023, 5, 100));
  an3 = int(map(quanti[3], 0, 1023, 0, 254));
  an4 = int(map(quanti[4], 0, 1023, 0, 254));
  an5 = int(map(quanti[5], 0, 1023, 0, 254));
  
  print(an0);
  print(",");
  print(an1);
  print(",");
  print(an2);
  print(",");
  print(an3);
  print(",");
  print(an4);
  print(",");
  println(an5);
}

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

void keyPressed()
{
  if (key == ' ')
  {
    film.finish();
  }
} 

Dei sei potenziometri, uno controlla il raggio dei cerchi, uno lo spazio tra i cerchi, un'altro l'opacità dei cerchi. Gli altri tre possono influenzare il colore variando la quantità di rosso, verde e blu.
Nello sketch ci sono pure le righe che ho usato per registrare il video sull'hard disk, ovvero tutte le chiamate a MovieMaker, che fa parte della libreria video.

Non so per quale motivo il video salvato è accellerato, forse è una conseguenza del fatto che il mio mac è vecchio e lento, e java è ancora più lento e, mentre registro, per passare da un frame all'altro, processing ci impiega più di quanto dovrebbe, effetto che sparisce quando si guarda la registrazione (che appare quindi velocizzata). Non so, ma in ogni caso gli effetti grafici sono interessanti e lo smanettamento è divertente.

Nessun commento:

Posta un commento