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

Flickering of graphics drawn over video

$
0
0

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);

  }
}

Viewing all articles
Browse latest Browse all 2896

Trending Articles