Сифон в жидкость захвата 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 вместе с конкретным техническим вопросом, и мы пойдем оттуда. Удачи.