问题描述
我正在使用 Processing IDE 为计算机视觉项目生成数百个短视频剪辑。现在,我正在使用 Python 创建一个 .pde
文件并运行它。这看起来大致如下:
PATH = "/my/local/director/"
list_of_variables = [1,2,etc.]
for i in list_of_variables:
naming = "p5_{:02d}_myfile".format(i)
os.mkdir(PATH + naming)
with open(PATH + naming + "/" + naming + ".pde",'w') as pdefile:
pdefile.write("contents of file go here " + i ";\n")
pdefile.write("saveFrame(\"frames/######.tif\");\n")
subprocess.Popen(["processing-ide","--sketch=" + PATH + naming,"--run"],stdout=subprocess.DEVNULL)
subprocess.call(["ffmpeg","-i",PATH + naming + "/frames/%06d.tif",PATH + naming + "out.mp4"],stdout=subprocess.DEVNULL)
shutil.rmtree(PATH + naming + "/frames/")
每次执行代码时,Processing IDE 都会打开一个预览窗口以显示正在发生的事情。我是否可以在执行步骤或 .pde
文件创建中传递一个选项来阻止预览窗口显示。这需要很长时间,我希望这会加快速度。
注意:是的,我认为有更好的选择来生成这些视频。回想起来,我应该在 Python 中使用 OpenCV
来加快速度,但这不是这个问题的重点。
解决方法
@KevinWorkman 的建议很棒!如果您真的真的需要使用 Processing 和 Headless 来做到这一点,那就是前进的方向。
草图的代码是什么样的? 如果是简单的绘图说明,您可以用多种方式重写它。 一种选择是简单地使用屏幕外 PGraphics 缓冲区,而不使用整个 PApplet 部分。
这是一个基本示例:
import processing.core.PGraphicsJava2D;
public class PGraphicsBufferTest {
public static void main(String[] args) {
PGraphicsJava2D pg = new PGraphicsJava2D();
// set dimensions
pg.setSize(300,300);
// set as offline (shouldn't expect a PApplet parent)
pg.setPrimary(false);
// draw
pg.beginDraw();
pg.background(0);
pg.ellipse(150,150,250,250);
pg.endDraw();
// save to disk: in absence of parent PApplet,must use absolute path
pg.save("/path/to/dataset/sequence/frame.png");
}
}
如果您将其另存为 PGraphicsBufferTest.java
(并且将 Processing 的 core.jar 放在同一文件夹中),例如您可以:
- 编译:{{1}}
- 运行:
javac -cp core.jar PGraphicsBufferTest.java
这可能仍会短暂地生成一个窗口,但希望会是一个更简单/更快的设置。
(我特意选择了Java2D,因为它已经是core.jar的一部分了。你当然可以使用java -cp .:core.jar PGraphicsBufferTest
,只是记得还要添加OpenGL依赖(gluegen-rt,jogl),并设置classpath({ {1}}),以及本机路径 (PGraphics2D
) 参数)
例如,有一个旧的 -cp
pip 包,它使用 Pyglet(OpenGL 包装器)。
因为 Pyglet 可以无头运行,希望如此,pyprocessing 也是如此。
我自己没有测试过这个,但是如果它确实有效,你可以保留一个非常相似的语法。
如果是简单的2D绘图指令,如果是计算机视觉项目,OpenCV的绘图功能应该足够了。
还有其他 Python 包提供具有无头配置的 2D 绘图功能(想到 Pillow 的 ImageDraw
模块)。
我认为的另一种选择是使用 openFrameworks,如果不是比您已经在做的更复杂的话。它是 C++,但受到 Processing 的启发,因此非常相似(例如 -Djava.library.path
、pyprocessing
、setup() = setup()
= draw() = update() + draw()
等)并且可以运行 headless。>