处理:网络摄像头保存和播放错误

时间:2017-10-10 04:45:53

标签: arrays image arraylist processing webcam

我应该超越这个,但我无法理解这个错误。我正在尝试编写一张草图,记录我的Mac相机的输入并存储每个录制内容#34;会话"到PImage数组,然后将其添加到会话列表(PImage [] ArrayList)。我正在使用重播'用于访问存储在内存中的图像并在随机位置重放它们的类。下面的代码应该可以直接复制到IDE中。

非常感谢任何帮助。我不知道为什么重放对象总是显示实时图像。谢谢!

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;
 }

}

1 个答案:

答案 0 :(得分:1)

看起来这是因为相机输入总是分配给每个单独的图像。为了获得“当前”视频流帧的“副本”,我只是将.get()添加到feed中,以便获取像素并将它们存储在PImage变量中。

currentImages.add(cam.get());