import processing.video.*;
Capture video;
void setup() {
size(640, 480);
// Uses the default video input, see the reference if this causes an error
video = new Capture(this, width, height);
video.start();
noStroke();
smooth();
}
void draw() {
if (video.available()) {
video.read();
image(video, 0, 0, width, height); // Draw the webcam video onto the screen
int pixelRed = 0; //value of red pixel
int pixelRed_g = 0;
int pixelRed_b = 0;
int redX = 0; // X-coordinate of the red video pixel
int redY = 0; // Y-coordinate of the red video pixel
int reddest = 0; // the brightest red pixel in the video
int reddest_g = 64;
int reddest_b = 64;
int pixelGreen = 0; //value of green pixel
int pixelGreen_r = 0;
int pixelGreen_b = 0;
int greenX = 0; // X-coordinate of the green video pixel
int greenY = 0; // Y-coordinate of the green video pixel
int greenest = 0; // the brightest green pixel in the video
int greenest_r = 64;
int greenest_b = 64;
int pixelBlue = 0; //value of blue pixel
int pixelBlue_r = 0;
int pixelBlue_g = 0;
int blueX = 0; // X-coordinate of the blue video pixel
int blueY = 0; // Y-coordinate of the blue video pixel
int bluest = 0; // the brightest blue pixel in the video
int bluest_r = 64;
int bluest_g = 64;
float brightestValue = 0; // Brightness of the brightest video pixel
// Search for the brightest pixel: For each row of pixels in the video image and
// for each pixel in the yth row, compute each pixel's index in the video
video.loadPixels();
int index = 0;
for (int y = 0; y < video.height; y++) {
for (int x = 0; x < video.width; x++) {
// Get the color stored in the pixel
color pixelValue = video.pixels[index];
// Extract the red, green, and blue components of the current pixel's color
int currR = (pixelValue >> 16) & 0xFF;
int currG = (pixelValue >> 8) & 0xFF;
int currB = pixelValue & 0xFF;
// If that value is red, find the brightest pixel and store its (x,y) location
if ( (currR > 128) && (currG < 64) && (currB < 64) ) {
pixelRed = currR; pixelRed_g = currG; pixelRed_b = currB;
if ((pixelRed > reddest) && (pixelRed_g < reddest_g) && (pixelRed_b < reddest_b)) {
reddest = pixelRed; reddest_g = pixelRed_g; reddest_b = pixelRed_b;
redY = y;
redX = x;
}
}
// If that value is green, find the brightest pixel and store its (x,y) location
if ( (currR < 64) && (currG > 64) && (currB < 64) ) {
pixelGreen = currG; pixelGreen_r = currR; pixelGreen_b = currB;
if ((pixelGreen > greenest) && (pixelGreen_r < greenest_r) && (pixelGreen_b < greenest_b)) {
greenest = pixelGreen; greenest_r = pixelGreen_r; greenest_b = pixelGreen_b;
greenY = y;
greenX = x;
}
}
// If that value is blue, find the brightest pixel and store its (x,y) location
if ( (currR < 64) && (currG < 64) && (currB > 128) ) {
pixelBlue = currB; pixelBlue_r = currR; pixelBlue_g = currG;
if ((pixelBlue > bluest) && (pixelBlue_r < bluest_r) && (pixelBlue_g < bluest_g)) {
bluest = pixelBlue; bluest_r = pixelBlue_r; bluest_g = pixelBlue_g;
blueY = y;
blueX = x;
}
}
index++;
}
}
// Draw a red circle at the red pixel
fill(255, 0, 0, 255);
ellipse(redX, redY, 20, 20);
// Draw a green circle at the green pixel
fill(0, 255, 0, 255);
ellipse(greenX, greenY, 20, 20);
// Draw a blue circle at the blue pixel
fill(0, 0, 255, 255);
ellipse(blueX, blueY, 20, 20);
}
}
Learn Electronics, Microcontrollers, Arduino, BBC Micro:bit, Raspberry Pi, Sensors, Programming and more...
Friday, 9 January 2015
Tracking three colours with Processing
This tutorial explains the coding and algorithm to track three colours (red, green and blue) with Processing Language.
Labels:
colour tracking,
processing
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment