保存背景减法捕捉帧

时间:2017-09-25 22:26:09

标签: save buffer processing pixel background-subtraction

我最近正在做一个背景扣除捕获演示但我遇到了困难。我已经获得了轮廓提取的像素,我打算通过createGraphics()将其绘制到缓冲区中。我设置新背景是100%透明的,这样我才能获得前景提取。然后我使用saveFrame()函数来获取每个帧的png文件。但是,它并没有像我预期的那样工作。我打算得到一系列的剪影提取 100%透明背景,但现在我只从相机Feed中获得一般帧数。有没有人可以帮我看看这段代码的问题是什么?非常感谢提前。任何帮助将不胜感激。

import processing.video.*;

Capture video;

PGraphics pg;

PImage backgroundImage;
float threshold = 30;

void setup() {
  size(320, 240);
  video = new Capture(this, width, height);
  video.start();

  backgroundImage = createImage(video.width, video.height, RGB); 
  pg = createGraphics(320, 240);
}

void captureEvent(Capture video) {
  video.read();
}

void draw() {
  pg.beginDraw();

  loadPixels();
  video.loadPixels();
  backgroundImage.loadPixels();

  image(video, 0, 0);
  for (int x = 0; x < video.width; x++) {
    for (int y = 0; y < video.height; y++) {
      int loc = x + y * video.width;



color fgColor = video.pixels[loc];
color bgColor = backgroundImage.pixels[loc];

float r1 = red(fgColor); float g1 = green(fgColor); float b1 = blue(fgColor);
float r2 = red(bgColor); float g2 = green(bgColor); float b2 = blue(bgColor);
float diff = dist(r1, g1, b1, r2, g2, b2);


if (diff > threshold) {
  pixels[loc] = fgColor;
} else {
  pixels[loc] = color(0, 0);
}
    }}
    pg.updatePixels();
    pg.endDraw();


    saveFrame("line-######.png");
}


void mousePressed() {
  backgroundImage.copy(video, 0, 0, video.width, video.height, 0, 0, video.width, video.height);
  backgroundImage.updatePixels();
}

1 个答案:

答案 0 :(得分:0)

回复:

  

然后我使用saveFrame()函数来获取每个帧的png文件。但是,它并没有像我预期的那样工作。我打算用100%透明的背景获得一系列png的轮廓提取,但现在我只能从相机输入中获得一般的帧数。

这不会起作用,因为saveFrame()会保存画布,而画布不支持透明度。例如,来自参考:

  

无法在主绘图表面上使用透明度alpha参数和背景颜色。它只能与PGraphics对象和createGraphics()一起使用。 https://processing.org/reference/background_.html

如果要转储具有透明度的框架,则需要使用.save()直接从PImage / PGraphics转储它。

如果您需要清除PImage / PGraphics并在每一帧重复使用,请使用pg.clear()pg.background(0,0,0,0)(将所有像素设置为透明黑色)。