Сифон в жидкость захвата Pixelflow

Я новичок, работающий над эскизом обработки, который принимает в качестве входного сигнала веб-камеру и применяет эффекты оптического потока и частиц. Эскиз называется OpticalFlow_CaptureFluid. Это из библиотеки PixelFlow Томаса Дивальда.

По сути, я хочу изменить эскиз CaptureFluid, чтобы он использовал канал сифона вместо канала веб-камеры.

Я посмотрел на эскиз Оптического потока и эскиз ReceiveFrames для Сифона. Я вроде понимаю, что делают разные части каждого эскиза, но, поскольку я не очень большой программист, у меня очень мало идей о том, как их объединить, чтобы эскиз оптического потока получал кадры из сифона.

Вот эскиз ReceiveFrames:

import codeanticode.syphon.*;

PGraphics canvas;
SyphonClient client;

void settings() {
  size(640, 480, P3D);
  PJOGL.profile = 1;
}

public void setup() {
  // Create syhpon client to receive frames 
  // from the first available running server: 
  client = new SyphonClient(this);

  background(0);
}

public void draw() {    
  if (client.newFrame()) {
    canvas = client.getGraphics(canvas);
    image(canvas, 0, 0, width, height);    
  }  
}

Набросок "Оптический поток" огромен, поэтому я включил только то, что, по моему мнению, является наиболее важным здесь. Весь эскиз связан выше. (Я бы тоже написал здесь, но я новичок, и мне не дадут опубликовать больше двух ссылок!)

OpticalFlow_CaptureFluid (отрывок)

import processing.opengl.PGraphics2D;
import processing.video.Capture;

        // webcam capture
        cam = new Capture(this, cam_w, cam_h, 30);
        cam.start();

        // render buffers
        pg_cam_a = (PGraphics2D) createGraphics(cam_w, cam_h, P2D);
        pg_cam_a.noSmooth();
        pg_cam_a.beginDraw();
        pg_cam_a.background(0);
        pg_cam_a.endDraw();

        pg_cam_b = (PGraphics2D) createGraphics(cam_w, cam_h, P2D);
        pg_cam_b.noSmooth();

        pg_fluid = (PGraphics2D) createGraphics(view_w, view_h, P2D);
        pg_fluid.smooth(4);


      public void draw() {

        if( cam.available() ){
          cam.read();

          // render to offscreenbuffer
          pg_cam_b.beginDraw();
          pg_cam_b.background(0);
          pg_cam_b.image(cam, 0, 0);
          pg_cam_b.endDraw();
          swapCamBuffer(); // "pg_cam_a" has the image now

          if(APPLY_BILATERAL){
            filter.bilateral.apply(pg_cam_a, pg_cam_b, 5, 0.10f, 4);
            swapCamBuffer();
          }

          // update Optical Flow
          opticalflow.update(pg_cam_a);

Я знаю, что мне нужно добавить "import codeanticode.syphon.*;" к эскизу CaptureFluid, избавьтесь от битов захвата веб-камеры и замените их новым сифонным клиентом. И я думаю, что все переменные pg_cam_a и pg_cam_b необходимо переименовать или как-то изменить. Я даже не очень понимаю, что они делают.

Хорошо, последнее: я нашел этот пост от этого парня, который отправляет кадры в и из эскиза с Сифоном. Он говорит, что это работает только в режиме P3D, но этот эскиз CaptureFluid использует P2D. Эскиз ReceiveFrames, который я разместил выше, использует P3D (см. Размер в настройках void), но я изменил его на P2D, и он, кажется, работает просто отлично, поэтому я не уверен, что это действительно проблема.

Заранее спасибо!

1 ответ

Ваш вопрос немного широк, но я могу попытаться помочь в общем смысле.

Во-первых, то, что вы, вероятно, не хотите слышать: вам будет трудно пытаться заставить код, который вы найдете в Интернете, делать то, что вы хотите, если вы действительно не понимаете, как это работает. Вы говорите, что вы на самом деле не кодер, и это нормально! Существует множество учебных пособий (бесстыдная самореклама: вот некоторые, которые я написал), которые помогут вам лучше понять код. Ваша цель должна состоять в том, чтобы понять каждый отдельный эскиз, прежде чем пытаться их использовать.

Теперь, чтобы "объединить" две программы, вам нужно начать с чистого эскиза. Это может показаться парадоксальным, но гораздо проще добавить материал к пустому эскизу, чем извлечь его из существующего эскиза.

Затем нужно разбить вашу проблему на более мелкие этапы и выполнять эти шаги по одному. Начните с малого (меньше, чем вы думаете, интересно) и продвигайтесь вперед очень маленькими шагами.

Например, вы говорите, что хотите использовать сифонную ленту. Получите это работает отлично, прежде чем двигаться дальше. Я думаю, что на самом деле у вас уже есть код, который делает это, но убедитесь, что вы действительно понимаете, как именно он работает: например, вам нужно понять, как canvas а также client переменные работают вместе.

Тогда вам нужно продвигаться вперед маленькими шагами. Не пытайтесь скопировать и вставить всю программу оптического потока. Выделите простейшую функциональность, которую вы можете найти - всего несколько строк кода за раз. Получите это с вашим сифонным кормом. Попробуйте нарисовать простую форму, например, на основе подачи сифона.

Затем продолжайте продвигаться вперед маленькими шагами. Продолжайте спрашивать себя, что самое маленькое, что я должен сделать? Сделай это. Получите это прекрасно работает, прежде чем перейти к следующему вопросу.

Если вы застряли на определенном этапе, вы можете опубликовать MCVE вместе с конкретным техническим вопросом, и мы пойдем оттуда. Удачи.

Другие вопросы по тегам