Kamera & Video
Um Videos darzustellen und die Kamera des Laptops anzusprechen muss eine Library importiert werden.
Zunächst wird also über Sketch > Library importieren die entsprechende Bibliothek runtergeladen. Danach wird am Anfang des Sketches folgendes Codestück eingefügt:
import processing.video.*;
Anschließend muss ein Capture-Objekt deklariert werden:
Capture video;
Zwei wichtige Klassen:
Capture um Live-Videos der Webcam abzuspielen
Movie um bereits existierenden Videoclips abzuspielen
video = new Capture(this, 800, 600);
drei Parameter: this, die Breite des erfassten Videos in Pixel sowie die Höhe.
man kann auch als 4. Parameter den Namen der Kamera angeben (das ist zB wichtig wenn man eine externe Kamera ansprechen möchte). Um die zur Verfügung stehenden Kameras anzuzeigen kann
println(Capture.list());
verwendet werden. Diese Funktion gibt eine Liste an verfügbaren Kameras an. Dann kann der Kameraname ganz einfach in Anführungszeichen ergänzt werden:
video = new Capture(this,1280, 720, „FaceTime HD Camera“);
video.start();
Die Darstellung des Videobildes wird durch die image()-Funktion aufgerufen:
image(video, 0, 0);
Zuvor haben wir bereits Events wie mousePressed() oder keyPressed() kennengelernt. Immer wenn eines dieser Ereignisse auftritt, wird die Funktion aufgerufen. Beim Ausgeben eines Videos gehört das Event captureEvent(Camera). Dieses tritt immer dann ein, wenn die Kamera ein neues Bild aufzeichnet und zur Verfügung stellt.
void captureEvent(Capture video) {
video.read();
}
Code für die Ausgabe eines Videos:
// Importieren der Video-Library
import processing.video.*;
// Deklarieren des Capture-Objekts
Capture video;
void setup() {
size(1280, 720);
// Initialisieren des Capture-Objekts
video = new Capture(this,1280, 720, "FaceTime HD Camera");
video.start();
}
void draw() {
// Darstellung des Video-Bildes im Ausgabefenster
image(video, 0, 0);
}
void captureEvent(Capture video) {
// Auslesen des verfügbaren Bildes der Kamera
video.read();
}
Übungen
Erweitere nun den Code, der das Bild der Laptop Kamera ausgibt.
Der Farbwert jedes 30. Bildpunktes soll ausgelesen werden. Siehe dazu die Übung im Unterkapitel Bilder. Beachte hierbei, dass nun nicht img.get(x,y), sondern video.get(x,y); verwendet wird.
Verzichte auf die Darstellung des Videobildes durch image(video, 0, 0), sondern zeichne stattdessen Ellipsen mit dem vorhin ausgelesenen Farbwerten.
- Lösung
// Importieren der Video-Library
import processing.video.*;
// Deklarieren des Capture-Objekts
Capture video;
int radius = 30;
void setup() {
size(1280, 720);
// Initialisieren des Capture-Objekts
video = new Capture(this, 1280, 720); // Apple Facetime-Cam HD Auflösung
video.start();
}
void draw() {
// zwei verschachtelte For-Schleifen um das Bild "abzutasten"
for(int y=0; y < height; y += 30){
for(int x=0; x < width; x += 30){
// Aufnahme der Farbwerte in die Variable c
color c = video.get(x,y);
//diesen Farbwert c als Füllwert bestimmen
fill(c);
noStroke();
ellipse(x,y,radius, radius);
}
}
}
void captureEvent(Capture video) {
// Auslesen des verfügbaren Bildes der Kamera
video.read();
}
Erweitere nun den Code: Nun soll die Schrittweite, inder die Farbwerte ausgelesen werden flexibel über die Tasten ‚-‚ und ‚+‘ erhöht und derselbe Wert auch die Größe der Ellipse bestimmen.
- Lösung
// Importieren der Video-Library
import processing.video.*;
// Deklarieren des Capture-Objekts
Capture video;
float resX = 15;
float resY = 15;
void setup() {
size(1280, 720);
// Initialisieren des Capture-Objekts
video = new Capture(this, 1280, 720); // Apple Facetime-Cam HD Auflösung
video.start();
}
void draw() {
// zwei verschachtelte For-Schleifen um das Bild "abzutasten"
for(int y=0; y <height; y += resX){
for(int x=0; x < width; x += resY){
// Aufnahme der Farbwerte in die Variable c
color c = video.get(x,y);
//diesen Farbwert c als Füllwert bestimmen
fill(c);
noStroke();
ellipse(x,y,resX, resY);
}
}
}
void captureEvent(Capture video) {
// Auslesen des verfügbaren Bildes der Kamera
video.read();
}
void keyPressed(){
if(key == '+'){
resX += 1;
resY += 1;
}
if(key == '-' && resX > 1){
resX -= 1;
resY -= 1;
}
}
Erweitere nun erneut den Code: Nun soll es nicht nur eine Form geben, sondern per Tastendruck soll die Form geändert werden. Verwende hierzu beispielsweise Quadrate oder Linien.
- Lösung
// Importieren der Video-Library
import processing.video.*;
// Deklarieren des Capture-Objekts
Capture video;
int radius = 30;
float resX = 15;
float resY = 15;
int shape;
void setup() {
size(1280, 720);
// Initialisieren des Capture-Objekts
video = new Capture(this, 1280, 720); // Apple Facetime-Cam HD Auflösung
video.start();
}
void draw() {
// zwei verschachtelte For-Schleifen um das Bild "abzutasten"
for(int y=0; y < height; y += resX){
for(int x=0; x < width; x += resY){
// Aufnahme der Farbwerte in die Variable c
color c = video.get(x,y);
//Shape 1 => Ellipsen
if(shape ==1){
//diesen Farbwert c als Füllwert bestimmen
fill(c);
noStroke();
ellipse(x,y,resX, resY);
}else if (shape == 2){ //Shape 2 => rect
fill(c);
noStroke();
rect(x,y,resX, resY);
}else if (shape == 3){ //Shape 3 => line
int xLine = x+int(random(-resX,resX));
int yLine = y+int(random(-resY,resY));
color cLine = video.get(xLine,yLine);
stroke(cLine,255);
strokeWeight(resX);
line(xLine,yLine, x+random(resX), y+random(resY));
}
}
}
}
void captureEvent(Capture video) {
// Auslesen des verfügbaren Bildes der Kamera
video.read();
}
void keyPressed(){
if(key == '+'){
resX += 1;
resY += 1;
}
if(key == '-' && resX > 1){
resX -= 1;
resY -= 1;
}
if(key == '1'){
shape = 1;
}
if(key == '2'){
shape = 2;
}
if(key == '3'){
shape = 3;
}
}
Code Inspiration von Andreas Pirchner.