Есть ли способ отключить окно предварительного просмотра в 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, который предотвратит отображение окна предварительного просмотра. Это занимает много времени, и я надеюсь, что это ускорит процесс.

Примечание. Да, я подумал, что есть лучшие варианты для создания этих видео. Оглядываясь назад, я должен был использовать OpenCV в Python, чтобы ускорить процесс, но суть этого вопроса не в этом.


person WesH    schedule 16.01.2021    source источник
comment
Это руководство может быть полезным: github.com/processing/processing/wiki/ Запуск без дисплея   -  person Kevin Workman    schedule 17.01.2021
comment
@KevinWorkman Сначала я скептически отнесся к этому предложению, так как предполагал, что шунтирование вывода дисплея в преисподнюю все равно потребует времени для создания изображений и их ожидания. Но я быстро запустил свой код с xvfb-run и без него, и время выполнения увеличилось с 23,4 с до 0,00368 с. Пожалуйста, ответьте на это, чтобы я мог отдать вам должное.   -  person WesH    schedule 19.01.2021


Ответы (1)


Совет @KevinWorkman великолепен! Если вам действительно действительно нужно сделать это с Processing и без головы, это путь вперед.

Как будет выглядеть код для скетча? Если это простые инструкции по рисованию, вы можете переписать их несколькими способами. Одним из вариантов может быть просто использование закадрового буфера 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 Processing в ту же папку), в качестве примера вы можете:

  • скомпилировать: javac -cp core.jar PGraphicsBufferTest.java
  • run: java -cp .:core.jar PGraphicsBufferTest Это все еще может ненадолго сгенерировать окно, но, надеюсь, это будет более простая/быстрая установка.

(Я намеренно выбрал Java2D, потому что он уже является частью core.jar. Конечно, вы можете использовать PGraphics2D, просто не забудьте также добавить зависимости OpenGL (gluegen-rt, jogl) и установить путь к классам (-cp), а также собственный путь (-Djava.library.path) аргументов)

Например, есть более старый пакет pyprocessing pip, который использует Pyglet (оболочку OpenGL). Надеюсь, что Pyglet может работать без головы, как и pyprocessing. Я не проверял это сам, однако, если это работает, вы можете сохранить очень похожий синтаксис.

Если это простая инструкция по рисованию в 2D и это для проекта компьютерного зрения, во что бы то ни стало, функций рисования OpenCV должно быть достаточно.

Существуют и другие пакеты Python, которые предлагают функции 2D-рисования с безголовыми конфигурациями (Pillow ImageDraw приходит на ум).

Другой вариант, который, как мне кажется, такой же, если не более сложный, чем тот, который вы уже делаете, заключается в использовании openFrameworks< /а>. Это C++, но вдохновленный Processing, поэтому он очень похож (например, setup() = setup(), draw() = update() + draw(), line(x1,y1,x2,y2) = ofDrawLine(x1,y1,x2,y2) и т. д.) и может работать без головы.

person George Profenza    schedule 17.01.2021
comment
Выберите правильный инструмент для работы. Это отличные предложения для тех, кто начинает новый итеративный проект по созданию видео, но он не предлагает ничего большего к исходному вопросу, который признает, что изначально был выбран неправильный инструмент, я просто пытаюсь его ускорить. - person WesH; 19.01.2021