Quantcast
Channel: Library Questions - Processing 2.x and 3.x Forum
Viewing all articles
Browse latest Browse all 2896

Approach to utilise variable data from Draw

$
0
0

Hello! New to Processing and have been experimenting with the tutorials and videos a bit, and have a hit a hurdle I am sure someone will have some insight to.

Essentially, I am trying to take the colour tracking algorithm from Tutorial 11.5, and utilise the avgX variable to control the panning of a sine wave. My code is below...

// Daniel Shiffman
// http://codingtra.in
// http://patreon.com/codingtrain
// Code for: 
image import processing.video.*; import processing.sound.*; SinOsc sine; Capture video; color trackColor; float threshold = 25; void setup() { size(640, 360); String[] cameras = Capture.list(); //printArray(cameras); video = new Capture(this, cameras[3]); video.start(); trackColor = color(255, 0, 0); } void captureEvent(Capture video) { video.read(); } void draw() { video.loadPixels(); image(video, 0, 0); //threshold = map(mouseX, 0, width, 0, 100); threshold = 20; float avgX = 0; float avgY = 0; int count = 0; // Begin loop to walk through every pixel for (int x = 0; x < video.width; x++ ) { for (int y = 0; y < video.height; y++ ) { int loc = x + y * video.width; // What is current color color currentColor = video.pixels[loc]; float r1 = red(currentColor); float g1 = green(currentColor); float b1 = blue(currentColor); float r2 = red(trackColor); float g2 = green(trackColor); float b2 = blue(trackColor); float d = distSq(r1, g1, b1, r2, g2, b2); if (d < threshold*threshold) { stroke(255); strokeWeight(1); point(x, y); avgX += x; avgY += y; count++; } } } // We only consider the color found if its color distance is less than 10. // This threshold of 10 is arbitrary and you can adjust this number depending on how accurate you require the tracking to be. if (count > 0) { avgX = avgX / count; avgY = avgY / count; // Draw a circle at the tracked pixel fill(255); strokeWeight(4.0); stroke(0); ellipse(avgX, avgY, 24, 24); } } float distSq(float x1, float y1, float z1, float x2, float y2, float z2) { float d = (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) +(z2-z1)*(z2-z1); return d; } void mousePressed() { // Save color where the mouse is clicked in trackColor variable int loc = mouseX + mouseY*video.width; trackColor = video.pixels[loc]; } { sine = new SinOsc(this); sine.pan(map(avgX, 0, width, -1.0, 1.0)); sine.play(); }

The problem is that the variable avgX cannot exist outside the draw. It works if I place the Oscillator in Draw, but that causes a crash in a hurry!

Any help greatly appreciated!

Best, Matt


Viewing all articles
Browse latest Browse all 2896

Trending Articles