2016-11-23 3 views
1

Ich versuche, die Visuals für eine Kunstinstallation zu machen, an der ich arbeite, und ich bin mir nicht ganz sicher, wie ich damit umgehen soll Wird bearbeitet. Hier ist, was würde ich tun (Ich werde einen alten CCTV-Monitor verwenden):Verarbeitung - zufälliges Video-Array + Webcam (um visuelle Sicherheitskopien zu machen)

  • Teilen Sie den Bildschirm in vier Quadranten (als ob es Feed von Sicherheitskameras anzeigt, aber ich würde Videos verwenden Zum größten Teil)

  • Lassen Sie Videos zufällig in diese Quadranten laden (aus insgesamt 8 Videos) und lassen Sie die Videos nach einer bestimmten Anzahl von Sekunden wechseln (sie müssen nicht alle gleichzeitig ändern, aber was auch immer am einfachsten ist)

  • Lassen Sie eine Webcam ihren Feed in einen der Quadranten senden, als wäre es ein anderes Video

(ich die Webcam eines der Viertel des Bildschirms und laden Zufalls Videos auf den anderen 3 verfügbaren Quadranten immer beheben können, wenn es die Dinge vereinfacht.)

Meine Verarbeitung Fähigkeiten sind recht einfach; Bisher habe ich es geschafft, den Bildschirm in 4 zu teilen und 4 Videos zu laden, aber ich weiß ehrlich nicht, wie ich mit einem Video-Array arbeiten soll, das klingt nach dem vernünftigeren Weg für das Programm, das zu tun, was ich möchte . Hier

ist der grundlegende Code:

import processing.video.*; 

Movie mov, mov1, mov2, mov3; 

    void setup() { 
     size(1280, 640); 
     frameRate(30); 
     mov = new Movie(this,"0.mov"); 
     mov1 = new Movie(this,"1.mov"); 
     mov2 = new Movie(this,"2.mov"); 
     mov3 = new Movie(this,"3.mov"); 

     mov.play(); 
     mov1.play(); 
     mov2.play(); 
     mov3.play(); 

     mov.volume(0); 
     mov1.volume(0); 
     mov2.volume(0); 
     mov3.volume(0); 
    } 

    void movieEvent(Movie mov) { 
     mov.read(); 
    } 

    void draw() { 
     image(mov, 0, 0, 640, 320); 
     image(mov1, 640, 0, 640, 320); 
     image(mov2, 0, 320, 640, 320); 
     image(mov3, 640, 320, 640, 320); 
    } 

ich mit dem oben angefangen und habe dann versucht, mit einer Reihe von Videos zu arbeiten, aber nur bekam so weit:

import processing.video.*; 

Capture cam; 

int maxmyMovies = 8; 
int myMoviesIndex = 0; 
Movie[] myMovies = new Movie[maxmyMovies]; 

void setup() { 

size(640,480); 

cam = new Capture(this, 640, 480, 12); 
cam.start(); 
smooth(); 

    for (int i = 0; i < myMovies.length; i ++) { 
    myMovies[i] = new Movie(this, i + ".mov"); 

    } 
} 

void draw() { 
image(myMovies[myMoviesIndex], 0, 0); 

    if (key == 'r') myMoviesIndex = int(random(0,8)); 

} 

void movieEvent(Movie myMovies) { 
    myMovies.read(); 
} 

(Die oben ist einfach kopieren/einfügen von anderen Codes, ich will nicht wirklich randomize wenn man den Buchstaben "r" drückt, sondern nach einer bestimmten Zeit.) Also, man sieht, ich bin hier ratlos ... ich würde wirklich schätze jede Hilfe.

Danke !!

Antwort

0

Es ist toll, du bist schon spalten, was Sie in Schritten erreichen wollen:

  1. Teilen Sie den Bildschirm in vier Quadranten (als ob es Feed von Sicherheitskameras anzeigt, aber ich Videos mit zum größten Teil )

  2. haben Videos Last zufällig (von insgesamt 8 Videos zu diesen Quadranten d sein) und die Videos Änderung haben nach eine bestimmte Anzahl von Sekunden (sie alle nicht auf einmal haben, zu ändern, aber was auch immer ist am einfachsten)

  3. Haben Sie eine Webcam sendet seinen Zufuhr in einen des Quadranten, als ob es ein weiteres Video

    war

Es sieht aus wie Sie bereits den ersten Abschnitt in Angriff genommen haben.

I würde spalten den zweiten Abschnitt weiter:

  1. Trigger eine Änderung nach einer bestimmten Anzahl von Sekunden (Zeit)
  2. holt einen Zufall Quadranten/Video

Auslöser, der als Aktion nach einer bestimmten Verzögerung kann mit millis() und bedingt erreicht werden. Sie können here

In Bezug auf die Kommissionierung Zufalls Quadranten/Video ein Beispiel und weitere Details sehen, sind Sie ganz in der Nähe: random() sollte es tun. Der schwierigste Teil ist, wie Sie Ihre Daten organisieren. Eine Möglichkeit wäre, den Überblick über zwei Arrays zu halten:

  1. eine Liste (Array) von Videos
  2. eine Liste der Quadranten auf eine Teilmenge der oben genannten Liste der Videos

zeigen anzuzeigen Die Videos sind immer zugänglich, aber nur eine Auswahl wird angezeigt. Speichern Sie einfach die Indizes der Videos aus der ersten Liste (der geladenen Videos) in eine zweite Liste (die Videoauswahl)

Ich würde auch empfehlen, sich die Angewohnheit zu machen, eine Reihe von Anweisungen zu gruppieren, die eine Aufgabe in eine Funktion ausführen . Auf diese Weise wird der Code leichter zu lesen/zu folgen, zu verwenden und vor allem zu verwenden.

Ich bin mir nicht sicher, ob Sie mit den Funktionen vertraut sind bereits, wie in sie von Grund auf neu zu schreiben, aber man habe sie ziemlich viel so weit mit :)

Wenn du sie nicht verwendet haben Sie sind nicht so schwer aufzuheben. Hier ist ein Versuch, die Idee zu vereinfachen, um sofort eine zu verwenden. Sie haben zum Beispiel smooth() aufgerufen und Sie haben void setup(){} geschrieben und eine Gruppe von Anweisungen darin platziert.

Ebenso können Sie Ihre eigene Funktion mit definieren, was Namen Sie wollen:

void myFunction(){ 
    println("myFunction is working!"); 
} 

die Sie dann rufen Sie einfach:

myFunction(); 

z.B.

Ich gebe zu, es ist nicht das aufregendste Beispiel, aber es sollte beweisen, wie einfach es ist, eine Funktion zu definieren und zu verwenden. Es gibt andere Details wie die Rückgabetypen und Argumente der Funktion, aber Sie können noch in diese kommen.

Lassen Sie sich dieses Wissen anwenden, um eine Funktion wählt zufällige Videos zu machen, die leicht aufgerufen werden können, wenn die ‚r‘ Taste gedrückt wird:

import processing.video.*; 

Capture cam; 

int maxmyMovies = 8; 
int myMoviesIndex = 0; 
Movie[] myMovies = new Movie[maxmyMovies]; 

int[] selection = {0,1,2,3}; 

void setup() { 

    size(640, 480); 

    cam = new Capture(this, 640, 480, 12); 
    cam.start(); 
    smooth(); 

    for (int i = 0; i < myMovies.length; i ++) { 
    myMovies[i] = new Movie(this, i + ".mov"); 
    } 

    selectRandomVideos(); 
} 

void selectRandomVideos(){ 
    //select random movie for each quadrant 
    for(int i = 0 ; i < selection.length; i++){ 
    //random() returns a float and the index in an int, therefore we cast to (int) 
    //this also has the side effect to rounding down (similar to floor()) which is convenient as we need 7 as the highest index 
    selection[i] = (int)random(0,maxmyMovies); 
    myMovies[selection[i]].loop(); 
    myMovies[selection[i]].volume(0); 
    } 
} 

void draw() { 
    //top left 
    image(myMovies[selection[0]], 0, 0); 
    //top right 
    image(myMovies[selection[1]], 640, 0); 
    //bottom left 
    image(myMovies[selection[2]], 0, 480); 
    //bottom right 
    image(myMovies[selection[3]], 640, 480); 
} 

void keyPressed(){ 
    if(key == 'r') selectRandomVideos(); 
} 

void movieEvent(Movie myMovies) { 
    myMovies.read(); 
} 

Hinweis: Der obige Code ist nicht getestet und die Videogröße ist nicht festgelegt (also entweder haben Sie die Videos in der richtigen Auflösung oder setzen Sie die Breite/Höhe beim Aufruf image() wie Sie zuvor getan haben).Der Code wird möglicherweise nicht so ausgeführt, wie er ist, sollte aber hoffentlich einen Lösungsansatz für die oben genannten Probleme darstellen.

Das ist also eine sehr einfache Möglichkeit, Videos per Randomisierung zu machen, und zwar für alle gleichzeitig. Diese Funktion ist ein ein einzelnes Video zu einem Zeitpunkt, zu handhaben sein gezwickt:

void selectRandomVideo(){ 
    //select random movie for one quadrant 
    //pick a quadrant 
    int randomQuadrant = (int)random(4); 
    //pick a video 
    int randomVideo = (int)random(maxmyMovies); 
    //store the random video index in the random quadrant 
    selection[randomQuadrant] = randomVideo; 
    //loop the random quadant's video and mute 
    myMovies[selection[randomQuadrant]].loop(); 
    myMovies[selection[randomQuadrant]].volume(0); 
} 

und integriert:

import processing.video.*; 

Capture cam; 

int maxmyMovies = 8; 
int myMoviesIndex = 0; 
Movie[] myMovies = new Movie[maxmyMovies]; 

int[] selection = {0,1,2,3}; 

void setup() { 

    size(640, 480); 

    cam = new Capture(this, 640, 480, 12); 
    cam.start(); 
    smooth(); 

    for (int i = 0; i < myMovies.length; i ++) { 
    myMovies[i] = new Movie(this, i + ".mov"); 
    } 

    selectRandomVideos(); 
} 

void selectRandomVideos(){ 
    //select random movie for each quadrant 
    for(int i = 0 ; i < selection.length; i++){ 
    //random() returns a float and the index in an int, therefore we cast to (int) 
    //this also has the side effect to rounding down (similar to floor()) which is convenient as we need 7 as the highest index 
    selection[i] = (int)random(0,maxmyMovies); 
    myMovies[selection[i]].loop(); 
    myMovies[selection[i]].volume(0); 
    } 
} 
void selectRandomVideo(){ 
    //select random movie for one quadrant 
    //pick a quadrant 
    int randomQuadrant = (int)random(4); 
    //pick a video 
    int randomVideo = (int)random(maxmyMovies); 
    //store the random video index in the random quadrant 
    selection[randomQuadrant] = randomVideo; 
    //loop the random quadant's video and mute 
    myMovies[selection[randomQuadrant]].loop(); 
    myMovies[selection[randomQuadrant]].volume(0); 
} 
void draw() { 
    //top left 
    image(myMovies[selection[0]], 0, 0); 
    //top right 
    image(myMovies[selection[1]], 640, 0); 
    //bottom left 
    image(myMovies[selection[2]], 0, 480); 
    //bottom right 
    image(myMovies[selection[3]], 640, 480); 
} 

void keyPressed(){ 
    if(key == 'r') selectRandomVideo(); 
} 

void movieEvent(Movie myMovies) { 
    myMovies.read(); 
} 

so etwas wie diese Verwendung und der millis() Basis-Timer den zweiten Abschnitt lösen.

Für die dritte Abschnitt können Sie den gleichen Trick verwenden. Es kann hilfreich sein, wenn Sie eine For-Schleife verwenden, um die Videos in Quadranten anzuzeigen, anstatt wiederholte image() Aufrufe zu verwenden. Innerhalb der Schleife können Sie anhand einer Bedingung entscheiden, ob ein Quadrant ein Video oder den Kamera-Feed anzeigen muss.

Wir können eine separate Variable verwenden, um zu verfolgen, welche Quadranten sollte die Kamera angezeigt in werden, dann zusammen, um eine Grundfunktion, die diesen Wert unter Verwendung von Zufallssätze:

void selectRandomCameraQuadrant(){ 
    //selects a valid index (0-3) or an invalid one (4) which means disable the camera 
    cameraIndex = (int)random(5); 
} 

Es gibt einen kleinen Hack oben, wo random(5) wird anstelle von random(4) verwendet. Dies würde gelegentlich die Chance geben, einen Index zu erhalten, der kein gültiger Quadrant ist, und daher den Kamera-Feed nicht ständig anzeigen.

Hier ist eine Version des Codes dieser Funktion und die ‚c‘ Taste mit einem zufälligen Kamerabild Quadranten auszuwählen:

import processing.video.*; 

Capture cam; 

int maxmyMovies = 8; 
int myMoviesIndex = 0; 
Movie[] myMovies = new Movie[maxmyMovies]; 

int[] selection = {0,1,2,3}; 

int cameraIndex = -1; 

void setup() { 

    size(640, 480); 

    cam = new Capture(this, 640, 480, 12); 
    cam.start(); 
    smooth(); 

    for (int i = 0; i < myMovies.length; i ++) { 
    myMovies[i] = new Movie(this, i + ".mov"); 
    } 

    selectRandomVideos(); 
} 

void selectRandomVideos(){ 
    //select random movie for each quadrant 
    for(int i = 0 ; i < selection.length; i++){ 
    //random() returns a float and the index in an int, therefore we cast to (int) 
    //this also has the side effect to rounding down (similar to floor()) which is convenient as we need 7 as the highest index 
    selection[0] = (int)random(0,maxmyMovies); 
    myMovies[selection[0]].loop(); 
    myMovies[selection[0]].volume(0); 
    } 
} 
void selectRandomVideo(){ 
    //select random movie for one quadrant 
    //pick a quadrant 
    int randomQuadrant = (int)random(4); 
    //pick a video 
    int randomVideo = (int)random(maxmyMovies); 
    //store the random video index in the random quadrant 
    selection[randomQuadrant] = randomVideo; 
    //loop the random quadant's video and mute 
    myMovies[selection[randomQuadrant]].loop(); 
    myMovies[selection[randomQuadrant]].volume(0); 
} 

void selectRandomCameraQuadrant(){ 
    //selects a valid index (0-3) or an invalid one (4) which means disable the camera 
    cameraIndex = (int)random(5); 
} 

void draw() { 
    //movie quadrant index 
    int movieIndex = 0; 
    //loop through y 
    for(int yIndex = 0; yIndex < 2; yIndex++){ 
    //loop through x 
    for(int xIndex = 0; xIndex < 2; xIndex++){ 
     //calculate x position based on index 
     int x = xIndex * 640; 
     int y = yIndex * 480; 

     //check if the camera index matches any of the quadrants (if so display camera, otherwise display movie) 
     if(movieIndex == cameraIndex){ 
     image(cam, x, y); 
     }else{ 
     image(myMovies[selection[movieIndex]], x, y); 
     } 
     //increment movie quadrant index 
     movieIndex++; 
    } 
    } 
} 

void keyPressed(){ 
    if(key == 'r') selectRandomVideo(); 
    if(key == 'c') selectRandomCameraQuadrant(); 
} 

void movieEvent(Movie myMovies) { 
    myMovies.read(); 
} 

Schlussnoten Dies ist nicht die beste/sauberste Weg, das zu lösen Problem, aber eine Idee. Es gibt mehrere Möglichkeiten, die dasselbe erreicht werden können.

Verwandte Themen