import processing.video.*;
Capture video;
int numPixels; // number of pixels in the video
int rectDivide = 4; // the stage width/height divided by this number is the video width/height
int vidW; // video width
int vidH; // video height
int[][] colouredPixels; // the different colour references for each pixel
int[][] colourCompareData; // captured r, g and b colours
int currR; //
int currG; //
int currB; //
int[][] squareCoords; // x, y, w + h of the coloured areas
color[] colours; // captured colours
int colourRange = 25; // colour threshold
int[][] centrePoints; // centres of the coloured squares
color[] pixelColours;
boolean isShowPixels = false; // determines whether the square and coloured pixels are displayed
int colourMax = 2; // max amount of colours - also adjust the amount of colours added to pixelColours in setup()
int coloursAssigned = 0; // amount of cours currently assigned
CoordsCalc coordsCalc;
void setup()
{
size(640, 480);
vidW = width / rectDivide;
vidH = height / rectDivide;
video = new Capture(this, vidW, vidH, 30);
noStroke();
numPixels = vidW * vidH;
colouredPixels = new int[vidH][vidW];
colourCompareData = new int[colourMax][3];
squareCoords = new int[colourMax][4];
colours = new color[colourMax];
centrePoints = new int[colourMax][2];
color c1 = color(0, 255, 0);
color c2 = color(255, 0, 0);
pixelColours = new color[colourMax];
pixelColours[0] = color(0, 255, 0);
pixelColours[1] = color(255, 0, 0);
coordsCalc = new CoordsCalc();
}
void captureEvent(Capture video)
{
video.read();
}
void draw()
{
noStroke();
fill(255, 255, 255);
rect(0, 0, width, height);
drawVideo();
coordsCalc.update();
for (int i = 0; i < coloursAssigned; i++)
{
if (isShowPixels) drawSquare(i);
}
}
void drawVideo()
{
for (int i = 0; i < coloursAssigned; i++)
{
fill(colours[i]);
rect(i * 10, vidH, 10, 10);
}
image(video, 0, 0);
noFill();
stroke(255, 0, 0);
strokeWeight(2);
rect(vidW - 4, vidH - 4, 4, 4);
}
void drawSquare(int i)
{
int sqX = squareCoords[i][0];
int sqY = squareCoords[i][1];
int sqW = squareCoords[i][2];
int sqH = squareCoords[i][3];
noFill();
stroke(0, 0, 255);
strokeWeight(3);
rect(sqX, sqY, sqW, sqH);
//stroke(0, 0, 255);
//strokeWeight(4);
rect(sqX * rectDivide, sqY * rectDivide, sqW * rectDivide, sqH * rectDivide);
line(sqX * rectDivide, sqY * rectDivide, ((sqX * rectDivide) + (sqW * rectDivide)), ((sqY * rectDivide) + (sqH * rectDivide)));
line(((sqX * rectDivide) + (sqW * rectDivide)), sqY * rectDivide, sqX * rectDivide, (sqY * rectDivide + sqH * rectDivide));
}
void keyPressed()
{
println("key pressed = " + key);
color currPixColor = video.pixels[numPixels - (vidW * 2) - 3];
int pixR = (currPixColor >> 16) & 0xFF;
int pixG = (currPixColor >> 8) & 0xFF;
int pixB = currPixColor & 0xFF;
if (key == 'p')
{
isShowPixels = !isShowPixels;
}
if (key == '1')
{
coloursAssigned = 1;
colourCompareData[0][0] = pixR;
colourCompareData[0][1] = pixG;
colourCompareData[0][2] = pixB;
colours[0] = color(pixR, pixG, pixB);
}
if (colourMax < 2 || coloursAssigned < 1) return;
if (key == '2')
{
coloursAssigned = 2;
colourCompareData[1][0] = pixR;
colourCompareData[1][1] = pixG;
colourCompareData[1][2] = pixB;
colours[1] = color(pixR, pixG, pixB);
}
if (key == '0')
{
coloursAssigned = 0;
}
}
2º..
class CoordsCalc
{
CoordsCalc()
{
}
void update()
{
int currX = vidW;
int currW = 0;
boolean isYAssigned = false;
boolean isWAssigned = false;
for (int j = 0; j < coloursAssigned; j++)
{
currX = vidW;
currW = 0;
isYAssigned = false;
isWAssigned = false;
for (int i = 0; i < numPixels; i++)
{
colouredPixels[abs(i / vidW)][i % vidW] = 0;
color currColor = video.pixels[i];
currR = (currColor >> 16) & 0xFF;
currG = (currColor >> 8) & 0xFF;
currB = currColor & 0xFF;
if(isColourWithinRange(j))
{
noStroke();
if (isShowPixels)
{
fill(pixelColours[j]);
rect((i % vidW), (abs(i / vidW)), 1, 1);
rect((i % vidW) * rectDivide, (abs(i / vidW)) * rectDivide, 1 * rectDivide, 1 * rectDivide);
}
if ((i % vidW) < currX)
{
currX = i % vidW;
squareCoords[j][0] = currX;
}
if (!isYAssigned)
{
isYAssigned = true;
squareCoords[j][1] = abs(i / vidW);
}
squareCoords[j][3] = (abs(i / vidW)) - squareCoords[j][1] + 1;
if((i % vidW) > currW)
{
currW = i % vidW;
isWAssigned = true;
}
}
if(i == numPixels - 1 && isWAssigned)
{
squareCoords[j][2] = currW - squareCoords[j][0] + 1;
}
}
}
for (int i = 0; i < coloursAssigned; i++)
{
centrePoints[i][0] = (squareCoords[i][0] * rectDivide) + ((squareCoords[i][2] * rectDivide) / 2);
centrePoints[i][1] = (squareCoords[i][1] * rectDivide) + ((squareCoords[i][3] * rectDivide) / 2);
fill(0, 0, 0);
ellipse(centrePoints[i][0], centrePoints[i][1], 10, 10);
}
}
boolean isColourWithinRange(int j)
{
if(currR > (colourCompareData[j][0] + colourRange) || currR < (colourCompareData[j][0] - colourRange))
{
return false;
}
if(currG > (colourCompareData[j][1] + colourRange) || currG < (colourCompareData[j][1] - colourRange))
{
return false;
}
if(currB > (colourCompareData[j][2] + colourRange) || currB < (colourCompareData[j][2] - colourRange))
{
return false;
}
return true;
}
}
http://www.openprocessing.org/visuals/?visualID=46073 audio minim