如何在处理中导出前景像素的视频
How to export a video of foreground pixels in processing
我正在做一个关于人物提取和背景减除的项目。我要导出前景人物的视频。向 Daniel Shiffman 学习,现在我可以获得前景的像素,但我不知道如何将这些像素导出为视频。或者我不需要立即导出它,但我需要将这些像素作为视频格式进行进一步处理。有没有人可以帮助我?非常感谢。如果有任何错误,请原谅我的英语。
代码如下:
import processing.video.*;
Capture video;
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);
}
void captureEvent(Capture video) {
video.read();
}
void draw() {
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, 0);
}
}}
updatePixels();
}
void mousePressed() {
backgroundImage.copy(video, 0, 0, video.width, video.height, 0, 0, video.width, video.height);
backgroundImage.updatePixels();
}
Stack Overflow 并不是真正为一般 "how do I do this" 类型的问题设计的。这是针对特定 "I tried X, expected Y, but got Z instead" 类型的问题。但我会尽力提供一般意义上的帮助:
你需要split your problem up into smaller pieces,然后一次接一个。以下是我可能会如何解决这个问题:
第 1 步: 隔离您想要的像素。你说你可以获得前景像素。现在使用 createGraphics()
函数将它们绘制到缓冲区。
步骤 2:将每个缓冲区作为图像文件存储在您的硬盘上。您可以使用 PImage
或 PGraphics
的 save()
函数来执行此操作。
第 3 步: 现在您已经有了每一帧,将它们拼接成一个视频。您可以使用 FFMPEG 或 ImageMagick 执行此操作。
在开始考虑将它们结合起来之前,让这些东西自己完美地工作。然后,如果您卡在某个特定步骤,您可以 post 一个 MCVE 那个步骤。祝你好运。
我正在做一个关于人物提取和背景减除的项目。我要导出前景人物的视频。向 Daniel Shiffman 学习,现在我可以获得前景的像素,但我不知道如何将这些像素导出为视频。或者我不需要立即导出它,但我需要将这些像素作为视频格式进行进一步处理。有没有人可以帮助我?非常感谢。如果有任何错误,请原谅我的英语。
代码如下:
import processing.video.*;
Capture video;
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);
}
void captureEvent(Capture video) {
video.read();
}
void draw() {
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, 0);
}
}}
updatePixels();
}
void mousePressed() {
backgroundImage.copy(video, 0, 0, video.width, video.height, 0, 0, video.width, video.height);
backgroundImage.updatePixels();
}
Stack Overflow 并不是真正为一般 "how do I do this" 类型的问题设计的。这是针对特定 "I tried X, expected Y, but got Z instead" 类型的问题。但我会尽力提供一般意义上的帮助:
你需要split your problem up into smaller pieces,然后一次接一个。以下是我可能会如何解决这个问题:
第 1 步: 隔离您想要的像素。你说你可以获得前景像素。现在使用 createGraphics()
函数将它们绘制到缓冲区。
步骤 2:将每个缓冲区作为图像文件存储在您的硬盘上。您可以使用 PImage
或 PGraphics
的 save()
函数来执行此操作。
第 3 步: 现在您已经有了每一帧,将它们拼接成一个视频。您可以使用 FFMPEG 或 ImageMagick 执行此操作。
在开始考虑将它们结合起来之前,让这些东西自己完美地工作。然后,如果您卡在某个特定步骤,您可以 post 一个 MCVE 那个步骤。祝你好运。