Kathedraalse Krollen op Zondagavond
afl. 1: video I/O loops -de basics
Benodigdheden:
- webcam (ik heb die van mijn dochter ingepikt)
- LCD scherm (in de omgang: een flatscreen, oude CRT’s geven natuurlijk alleen maar lijnen)
- redelijk recente computer met Windows (XP of erger)
- Processing Beta 1.0 (gratis te downloaden via http://processing.org)
- Quictime 7.0 of hoger voor windows : www.apple.com/quicktime
- video digitizer WINVDIG: Click here to download the installer for version 1.0.1 of WinVDIG (Processing gebruikt Quicktime voor Java, die wordt automatisch en zonder problemen meegeïnstaleerd door QT 7. Je hebt dan nog wel die ‘digitizer’ nodig , da’s een software brug die zorgt voor de link met je camera – gebruik geen hogere versie van WinVDIG, die werken niet meer)
Verhelderende uitleg (?):
Het scriptje in Processing stuurt rijtjes frames naar het scherm.
Je houdt de webcam voor het scherm, dáár waar het java-scherm de output geeft.
Als je dat ding dan wat schuin houdt, krijg je met een beetje geluk op een zeker moment in de feedbackloop leuke kleurige fractalen.
Het verkregen studieproces is in menig opzicht zéér interessant. U zal merken dat het beeld wijzigt in cycli, maar dat de cycli zelf ook in lengte variëren. Een enkele keer kan u zelfs op een ‘dood punt’ terechtkomen, dat het beeld een tijdje geheel ongewijzigd blijft. Op de video hieronder ziet u op het einde de aanloop naar zo’n verval in periodiciteit (= stabiele, invariabele staat, herinner u van de lesjes chaos theorie van Hollywood : hoe instabieler een proces is, hoe dichter bij een collaps, hoe interessanter het is)
Video van de proefopstelling:
het script in Processing ( beetje aangepast van wat er in de Library aan voorbeeld zit):
import processing.video.*;
Capture video;
int column;
int columnCount;
int lastRow;
// Buffer used to move all the pixels up
int[] scoot;
void setup() {
size(640, 480, P3D);
// Uses the default video input, see the reference if this causes an error
String[] devices = Capture.list();
// println(devices);
// Change devices[0] to the proper index for your camera.
video= new Capture(this, 160, 120, devices[2]);
//video = new Capture(this, 64, 48);
// Also try with other video sizes
column = 0;
columnCount = width / video.width;
int rowCount = height / video.height;
lastRow = rowCount - 1;
scoot = new int[lastRow*video.height * width];
background(0);
}
void draw() {
// By using video.available, only the frame rate need be set inside setup()
if (video.available()) {
video.read();
set(video.width*column, video.height*lastRow, video);
column++;
if (column == columnCount) {
loadPixels();
// Scoot everybody up one row
arraycopy(pixels, video.height*width, scoot, 0, scoot.length);
arraycopy(scoot, 0, pixels, 0, scoot.length);
column = 0;
updatePixels();
}
}
}
Door toevoeging van de saveFrame() methode aan het einde van de draw() cyclus kan je makkelijk een videootje wegschrijven (in bitmapsekwensjes, jpeg, Tiff of Targa, naargelang de extensie die je kiest). De draw() methode wordt dan:
void draw() {
// By using video.available, only the frame rate need be set inside setup()
if (video.available()) {
video.read();
set(video.width*column, video.height*lastRow, video);
column++;
if (column == columnCount) {
loadPixels();
// Scoot everybody up one row
arraycopy(pixels, video.height*width, scoot, 0, scoot.length);
arraycopy(scoot, 0, pixels, 0, scoot.length);
column = 0;
updatePixels();
}
}
saveFrame("loop1_####.jpg");
}
Het programmaatje wordt dan echter zo traag dat de uiteindelijke interactie niet meer zo geweldig interessant is. Het interessante gebeurt natuurlijk daar waar de camera poogt scherp te stellen op z’n eigen output, als het tijdsverschil te groot wordt, geeft dat niet veel soeps meer.
Getuige deze videodump van de loop, enkele seconden maar dit werd wel gedurende ettelijke minuten geregistreerd:
Je kan het dan terug interessant maken door geen rijtjes feedback te maken maar slechts 1 frame, dus door je Capture even groot te maken als de size van je Processing applet. Hier ong 2 minuten absoluut hulpeloze webcam gereduceerd tot een filmpje van 20 seconden. Vooral hoe de webcam op het einde het muispijltje probeert te focussen is bijzonder aandoenlijk:
Verder zijn natuurlijk de creatieve mogelijkheden onuitputtelijk als je de camera op iets minder Kathedraalse wijze niet op z’n eigen output maar op andere dingen richt: