1

我是一个处理草图的菜鸟,该草图将网络摄像头作为输入并应用光流和粒子效果。该草图称为OpticalFlow_CaptureFluid。它来自 Thomas Diewald 的 PixelFlow 库。

基本上,我想修改 CaptureFluid 草图,使其采用虹吸管源而不是网络摄像头源。

我查看了 Syphon 的光流草图和接收帧草图。我有点理解每个草图的不同部分在做什么,但是因为我不是一个编码员,所以我很少知道如何组合它们,以便光流草图从虹吸管接收帧。

这是 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 变量都需要重命名或以某种方式修改。Tbh 我什至不明白他们在做什么。

好的最后一件事:我发现了这个人的这篇文章,他正在使用 Syphon 发送帧进出草图。他说这只适用于 P3D 模式,但这个 CaptureFluid 草图使用 P2D。我在上面发布的 ReceiveFrames 草图使用 P3D(请参阅 void 设置下的大小),但我将其更改为 P2D 并且它似乎工作得很好,所以我不确定这是否真的是一个问题。

提前致谢!

4

1 回答 1

0

你的问题有点宽泛,但我可以尝试在一般意义上提供帮助。

首先,您可能不想听到的内容:如果您不真正了解它的工作原理,您将很难尝试将您在互联网上找到的代码锤炼成您想要的东西。你说你不是真正的编码员,那没关系!有大量的教程(无耻的自我推销:是我写的一些)可以帮助你更好地理解代码。您的目标应该是在尝试使用它们之前了解每个单独的草图。

现在,要“组合”两个程序,您实际上想要做的是从一个空白草图重新开始。这可能看起来自相矛盾,但向空白草图添加东西比从现有草图中取出东西要容易得多。

然后就是把你的问题分解成更小的步骤,并一次一个地采取这些步骤。从小处着手(比您认为有趣的小)并以非常小的步骤向前迈进。

例如,您说您想使用虹吸管源。在你继续之前让它完美地工作。我认为您实际上已经拥有执行此操作的代码,但请确保您真正了解它的工作原理:例如,您需要了解canvasclient变量如何协同工作。

然后你需要一步一步地向前迈进。不要试图复制粘贴整个光流程序。隔离你能找到的最简单的功能——一次只需几行代码。让它与您的虹吸饲料一起使用。例如,尝试根据虹吸进水绘制一个简单的形状。

然后继续以这样的小步骤向前迈进。不断问自己,我知道我需要做的最小的事情是什么?去做。在继续下一件事情之前让它完美地工作。

如果您在某个特定步骤上遇到困难,那么您可以发布一个MCVE以及一个特定的技术问题,我们将从那里开始。祝你好运。

于 2017-06-19T17:12:42.073 回答