有没有办法在 Processing IDE 中禁用预览窗口?

问题描述

我正在使用 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.pathpyprocessingsetup() = setup() = draw() = update() + draw() 等)并且可以运行 headless。>