【问题标题】:Processing: webcam save and playback bug处理:网络摄像头保存和播放bug
【发布时间】:2017-10-10 04:45:53
【问题描述】:

我应该超越这个,但我无法深入了解这个错误。我正在尝试编写一个草图来记录我的 Mac 相机的馈送并将每个记录“会话”存储到 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;
 }

}

【问题讨论】:

    标签: arrays image arraylist processing webcam


    【解决方案1】:

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

    currentImages.add(cam.get());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      相关资源
      最近更新 更多