We are about to switch to a new forum software. Until then we have removed the registration on this forum.
I'm having trouble with some code that I've patched together. I've managed to get this to mostly work, but when it runs the toplayer graphics over the video flicker, I think while the video updates. Is there a way to keep this from happening?
code below:
import ipcapture.*;
IPCapture cam1;
// Circular buffer
PImage[] cam1_buffer;
// These determine the size of the circular buffer and help iterate while writing and reading through them
int nFrames = 1;
int iWrite = 0, iRead = 1;
// Track color var
color trackColor;
//top layer drawing thing
PGraphics topLayer;
void setup() {
size(704, 480);
cam1 = new IPCapture(this, "http://" + "155.41.145.37/mjpg/video.mjpg", "", "");
cam1.start();
// If the camera resolution isn't explicitely defined the PImage.get() method will give strange results
cam1.pixelWidth = 704;
cam1.pixelHeight = 480;
cam1_buffer = new PImage[nFrames];
//Track color vars
colorMode(RGB,255,255,255,100);
trackColor = color(255,0,64);
noFill();
smooth();
strokeWeight(4.0);
stroke(0);
//create a top layer for circles
topLayer = createGraphics(width, height, g.getClass().getName());
}
void draw() {
if (cam1.isAvailable()) {
cam1.read();
cam1_buffer[iWrite] = cam1.get();
if(cam1_buffer[0] != null){
// The original camera image is displayed correctly at 480x300 in the upper left corner
image(cam1,0,0);
}
}
//Track colors below
loadPixels();
//Color tracking vars
float closestDiff = 500.0f;
int closestX = 0;
int closestY = 0;
//Loop through every pixel
for (int x = 0; x < cam1.pixelWidth; x++){
for (int y = 0; y < cam1.pixelHeight; y++){
int loc = x + y*cam1.pixelWidth;
//what is current color
color currentColor = cam1.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);
//Using euclidean distance to compare colors
float d = dist(r1,g1,b1,r2,g2,b2);
//If current color is more similar to tracked color than
//closest color, save current location and current difference
if (d < closestDiff) {
closestDiff = d;
closestX = x;
closestY = y;
}
}
}
//create a threshold
//then create a circle at the tracked color
if (closestDiff < 100) {
topLayer.beginDraw();
topLayer.noFill();
topLayer.strokeWeight(4.0);
topLayer.stroke(trackColor);
topLayer.ellipse(closestX, closestY, 50, 50);
topLayer.endDraw();
image(topLayer, 0, 0);
}
}