1

我正在使用 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文件创建中传递一个选项来阻止预览窗口显示。这需要很长时间,我希望这会加快速度。

注意:是的,我认为生成这些视频有更好的选择。回想起来,我应该OpenCV在 Python 中使用来加快速度,但这不是这个问题的重点。

4

1 回答 1

2

@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(并将处理的 core.jar 保存在同一文件夹中),例如,您可以:

  • 编译:javac -cp core.jar PGraphicsBufferTest.java
  • 运行:java -cp .:core.jar PGraphicsBufferTest 这可能仍会短暂生成一个窗口,但希望是更简单/更快的设置。

(我特意选择了Java2D,因为它已经是core.jar的一部分了。你PGraphics2D当然可以使用,只要记住还要添加OpenGL依赖项(gluegen-rt,jogl),并设置类路径(-cp),还要设置本机路径(-Djava.library.path)论据)

例如,有一个pyprocessing使用 Pyglet(OpenGL 包装器)的旧 pip 包。因为 Pyglet 可以无头运行,所以 pyprocessing 也可以。我自己没有对此进行测试,但是如果它确实有效,您可以保持非常相似的语法。

如果它是简单的 2D 绘图指令,而这对于计算机视觉项目来说,无论如何,OpenCV 的绘图功能就足够了。

还有其他 Python 包提供了无头配置的 2D 绘图功能(ImageDraw想到了 Pillow 的模块)。

我可以认为的另一个选择就是使用openFrameworks,如果不是比你已经在做的更复杂的话。它是 C++,但受到 Processing 的启发,因此非常相似(例如setup() = setup(), draw() = update() + draw(), line(x1,y1,x2,y2)=ofDrawLine(x1,y1,x2,y2)等)并且可以无头运行。

于 2021-01-17T00:43:20.300 回答