我正在使用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来提高速度,但这不是这个问题的主旨。
发布于 2021-01-17 08:43:20
@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保存在同一文件夹中),例如,您可以:
javac -cp core.jar PGraphicsBufferTest.javajava -cp .:core.jar PGraphicsBufferTest这可能仍然会短暂地生成一个窗口,但希望能有一个更简单/更快的设置。(我特意选择了Java2D,因为它已经是core.jar的一部分。当然,您也可以使用PGraphics2D,只需记住还要添加OpenGL依赖项(gluegen-rt,jogl),并设置类路径(-cp)和本机路径(-Djava.library.path)参数)
例如,有一个使用Pyglet (OpenGL包装器)的较旧的pyprocessing pip包。因为Pyglet可以无头运行,希望如此,所以pyprocessing也是如此。我自己没有测试过这一点,但是如果它能工作,你可以保持非常相似的语法。
如果是简单的2D绘图指令,如果是计算机视觉项目,那么OpenCV的绘图功能应该就足够了。
还有其他的Python包提供了2D绘图特性和无头配置(我想到了Pillow的ImageDraw模块)。
我认为另一个选择就是使用openFrameworks,如果不是比你已经做的更复杂的话。它是C++,但灵感来自于处理过程,因此非常相似(例如,setup() = setup()、draw() = update() + draw()、line(x1,y1,x2,y2) = ofDrawLine(x1,y1,x2,y2)等)并且可以运行headless。
https://stackoverflow.com/questions/65754853
复制相似问题