2017-10-10 7 views
0

Je devrais être au-delà de cela, mais je ne peux pas aller au fond de cette erreur. J'essaie d'écrire une esquisse qui enregistre le flux de mon appareil photo Mac et stocke chaque "session" d'enregistrement dans un tableau PImage, puis ajoute cela à une liste de sessions (un PImage [] ArrayList). J'utilise une classe 'Replay' pour accéder aux images stockées dans la mémoire et les rejouer à une position aléatoire. Le code ci-dessous devrait être prêt à être copié directement dans l'EDI.Traitement: webcam enregistrer et lecture bug

Toute aide serait grandement appréciée. Je n'ai aucune idée de la raison pour laquelle les objets de relecture affichent toujours l'image en direct. Merci!

import processing.video.*; 
Capture cam; 

ArrayList<PImage[]> allImages; 
ArrayList<PImage> currentImages; 
ArrayList<Replay> replays; 

boolean recording = false; 
boolean finishedSaving = true; 
int currentIndex = 0; 

void setup() { 
    size(1056, 704, P2D); 
    frameRate(30); 

    allImages = new ArrayList<PImage[]>(); 
    currentImages = new ArrayList<PImage>(); 
    replays = new ArrayList<Replay>(); 

    String[] cams = Capture.list(); 
    if (cams.length == 0) { 
    println("No cams!"); 
    exit(); 
    } else { 
    cam = new Capture(this, 1056, 704, cams[0], 30); 
    cam.start(); 
    } 

} 

void draw() { 
    background(0); 

    if (cam.available() == true) { 
    cam.read(); 
    } 


    for (Replay r : replays) { 
    r.display(); 
    } 

    if (recording) { 
    currentImages.add(cam); 
    noFill(); 
    stroke(255, 0, 0); 
    strokeWeight(5); 
    rect(0, 0, cam.width/3, cam.height/3); 
    } else { 
    saveToArray(); 
    } 

    image(cam, 0, 0, cam.width/3, cam.height/3); 

} 

void saveToArray() { 
    if (!finishedSaving) { 
    PImage[] tempImages = currentImages.toArray(new PImage[currentImages.size()]); 
    allImages.add(tempImages); 
    currentImages.clear(); 
    println("Finished saving to allImages array"); 
    println("allImages array size now = " + allImages.size()); 

    replays.add(new Replay(currentIndex)); 
    println("Added new Replay (index: " + currentIndex + ")"); 
    currentIndex++; 
    finishedSaving = true; 
    println(); 
    } 

} 

void keyPressed() { 
    if (key == 'r' || key == 'R') { 
    recording = !recording; 
    println("Recording: " + recording); 
    finishedSaving = false; 
    } 
} 

class Replay { 

    PVector position; 
    float w, h; 
    PImage[] images; 
    int count; 

Replay(int allImagesIndex) { 
    w = cam.width/3; 
    h = cam.height/3; 
    position = new PVector(random(width-w), random(height-h)); 
    count = 1; 
    images = allImages.get(allImagesIndex); 
} 

void display() { 
    image(images[count], position.x, position.y, w, h); 
    count++; 
    if (count > images.length-1) count = 1; 
} 

} 

Répondre

1

Cela semble dû au fait que le flux de la caméra est toujours affecté à chaque image individuelle. Pour obtenir une "copie" du cadre de flux vidéo "en cours", j'ai simplement ajouté .get() au flux afin qu'il récupère les pixels et les stocke dans une variable PImage.

currentImages.add(cam.get());