Can Video and Text Co-exist?


#1

I have been using Daniel Example “sketch_11_5_AveragePixelColorTracking” for blob tracking.
I thought I could get myself a couple of text lines under the video in the sketch to show XY etc…

The text displays but does not erase with each iteration. So I got numbers on top of old numbers…

What to do ?
Thanks a lot

here is my code

import processing.video.*;
import java.awt.Font;

PFont f;
PFont font;
int w= #FFFFFF; // white
int y= #FCF442; //yellow
int g= #A0FFA3; //green
int b= #64E1FF; // blue
int m= #CC15D3; // Magenta
int o= #FF6C67;  // orange
int i= #B767FF; // indigo
int r= #FC0B03; // red
int bk = (#212121);

Capture video;

color trackColor; 
float threshold = 25;

int Wheel; // value from the mouse wheel
int WheelAcc=0; // mouse wheel accoumulated


void setup() {
  size(1800, 1100, JAVA2D);
  String[] cameras = Capture.list();
  printArray(cameras);
  video = new Capture(this, "name=iSight,size=640x480,fps=15");
  video.start();
  trackColor = color(255, 0, 0);
  font = loadFont("AgencyFB-Bold-200.vlw");
}

void captureEvent(Capture video) {
  video.read();
}

void draw() {

  video.loadPixels();
  image(video, 0, 0);

  //threshold = map(mouseX, 0, width, 0, 100);
  threshold = 30+ WheelAcc;
  threshold = constrain (threshold, 0, 100);

  // /*
  float avgX = 0;
  float avgY = 0;

  int count = 0; // nr of pixels found in 

  // 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 > 20) { 
    avgX = avgX / count;
    avgY = avgY / count;
    // Draw a circle at the tracked pixel
    println(avgX + " is avgX") ;
    println(avgY + " is avgY") ;
    fill(255);
    strokeWeight(4.0);
    stroke(0);
    ellipse(avgX, avgY, 24, 24);
  }
  textFont(font, 45); 
  fill (r);
  text("avgX, AvgY:", 10, 930 ); 
  text( nf(avgX, 0, 1), 240, 930);
  text( nf(avgY, 0, 1), 380, 930);
  text( "     ", 240, 930);
  text( "     ", 380, 930);
} // end of draw

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() {
  if (mouseButton == LEFT) { // Save color where the mouse is clicked in trackColor variable
    int loc = mouseX + mouseY*video.width; // definition of location by pixel number.
    trackColor = video.pixels[loc];
    println(loc + " is loc") ;
    println(trackColor + " is trackColor") ;
  } else if (mouseButton == RIGHT) 
  {
  }
}

void mouseWheel(MouseEvent event) {
  Wheel = event.getCount();
  WheelAcc = WheelAcc + Wheel;
  //println(WheelAcc + "Acc") ;
  //println(Wheel + "Wheel") ;
  println(threshold + " is Treshold") ;
  Wheel = 0;
}

#2

Did you try to draw rect before your text for a backbround for your text ?


#3

Thanks a lot for the quick reply.
That worked. Why is this happening?

And one more question please: I dont understand the line:
trackColor = video.pixels[loc];

It is returning a color in the format " -6377867" for example, for red. What does the number mean?
I was used with RGB values, or Hex.

Thanks


#4

I think it is because you miss the background(0); in the draw()


#5

O my God that was so simple.
I aded it and it worked, TNKS a. lot pascal


#6

the trackColor is a number that contain the color of one pixel , it can be divided
in red , blue and green like this

    color trackColor = video.pixels[loc];
     fill(trackColor);
 
     text(str(int(red(trackColor)))+","+str(int(green(trackColor)))+","+str(int(blue(trackColor))),mouseX-160+55,mouseY-160+55);

#7

Here is an installation I did this year , and I have stated with the Daniel Blob Tracking tutorail.
https://vimeo.com/291156737


#8

Pascal,

Thanks a lot for the clarifications. I saw your presentation, very nice. Are you a veterinarian?

I am trying to make a sketch that will pick a dice from the table by a robotic arm.
I will let you know when is done,


#9

No but I work for veterinarian at Université de Montréal, I did this art project in collaboration with a veterinairan searcher.

For your dice project will you have to detect bolb with computer vision?
If yes look this tuto, that was my starting point for my project.

Bolb detection tutorial by Daniel Shiffman
good lock and let my know