Changes

Jump to: navigation, search

Motion Animation - Greg Parsons

5,536 bytes added, 22:38, 29 April 2010
New page: ---- Midterm Project ;Motivation: : I was interested in the demonstrations of computer vision presented during the first week of lecture. Using the in class sampling of the technol...

----

Midterm Project

;Motivation:
: I was interested in the demonstrations of computer vision presented during the first week of lecture. Using the in class sampling of the technologies I was impressed by how I was able to manipulate a project using frame differencing. I would like to create a project that is manipulated by movements from the viewer of the project.
;Interaction:
: The interaction of the project will be enacted with a webcam, recording movement in a scene and manipulating a graphical image based on the data collected from the difference in frames. In total the project would react to the viewers movements in some way.
;Function:
: My programming experience is limited to the past two quarters of instruction. But I would like to be able to achieve smooth movement in the image using some form of algorithmic processing.
;Visualization:
: I have a semi-working project that I created this weekend using a visual example from OpenProcessing.org that I will show in class if needed.


----

Code for Demo:

Copy this into a new processing project to test.

<nowiki>/**
* Greg Parsons VIS145B Midterm Test
*
* Project Uses Frame Differencing to detect motion, sees it and draws a picture
*
*/


//videocapture
import processing.video.*;
float x, y;
int numPixels;
int[] previousFrame;
int[] diffFrame;
Capture video;

//treecursion
float curlx = 0;
float curly = 0;
float f = sqrt(2)/2.;
float deley = 20;
float growth = 0;
float growthTarget = 0;


int movementDiff = constrain(10, 5, 15);
int movementDiffNegative = constrain(10, -5, -10);

void setup() {
//video capture
size(640, 480, P2D); //P2D from treecursion
video = new Capture(this, width, height, 24);
numPixels = video.width * video.height;
previousFrame = new int[numPixels];
diffFrame = new int[numPixels];
loadPixels();
smooth();
//treecursion
addMouseWheelListener(new java.awt.event.MouseWheelListener() {
public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) {
mouseWheel(evt.getWheelRotation());
}
}
);
}

void draw() {



//video capture
if (video.available()) {


// When using video to manipulate the screen, use video.available() and
// video.read() inside the draw() method so that it's safe to draw to the screen
video.read(); // Read the new frame from the camera
video.loadPixels(); // Make its pixels[] array available

int movementSum = 0; // Amount of movement in the frame
for (int i = 0; i < numPixels; i++) { // For each pixel in the video frame...
color currColor = video.pixels[i];
color prevColor = previousFrame[i];
// Extract the red, green, and blue components from current pixel
int currR = (currColor >> 16) & 0xFF; // Like red(), but faster
int currG = (currColor >> 8) & 0xFF;
int currB = currColor & 0xFF;
// Extract red, green, and blue components from previous pixel
int prevR = (prevColor >> 16) & 0xFF;
int prevG = (prevColor >> 8) & 0xFF;
int prevB = prevColor & 0xFF;
// Compute the difference of the red, green, and blue values
int diffR = abs(currR - prevR);
int diffG = abs(currG - prevG);
int diffB = abs(currB - prevB);
// Add these differences to the running tally
movementSum += diffR + diffG + diffB;
// Render the difference image to the screen
//diffFrame = color(diffR, diffG, diffB);
diffFrame[i] = round(sqrt(diffR*diffR + diffG*diffG + diffB*diffB));
// pixels[i] = currColor;
// pixels[i] = color(diffFrame[i]);
// The following line is much faster, but more confusing to read
//pixels[i] = 0xff000000 | (diffR << 16) | (diffG << 8) | diffB;
// Save the current color into the 'previous' buffer
previousFrame[i] = currColor;
}
// To prevent flicker from frames that are all black (no movement),
// only update the screen if the image has changed.
if (movementSum > 0) {
updatePixels();
// println(movementSum); // Print the total amount of movement to the console
}
}

int v = round(x+y*width);
if (diffFrame[v] > 5)
{


if ((diffFrame[v] > 5) && (diffFrame[v] < 15))
{
movementDiff = movementDiff + 3;
}
else if ((diffFrame[v] > 15) && (diffFrame[v] < 50))
{
movementDiff = movementDiff - 3;
}

movementDiffNegative = (movementDiff * -1);

System.out.println("the movement diff is" + movementDiff + "the movementDiffNegative is" + movementDiffNegative);
//treecursion
background(250);
stroke(0);
curlx += (radians(360./height*movementDiff)-curlx)/deley;
curly += (radians(360./height*movementDiffNegative)-curly)/deley;
translate(width/2,height/3*2);
line(0,0,0,height/2);
branch(height/4.,17);
growth += (growthTarget/10-growth+1.)/deley;
println(diffFrame[v]);
}

}

void mouseWheel(int delta)
{
growthTarget += delta;
}

//treecursion
void branch(float len,int num)
{
len *= f;
num -= 1;
if((len > 1) && (num > 0))
{
pushMatrix();
rotate(curlx);
line(0,0,0,-len);
translate(0,-len);
branch(len,num);
popMatrix();

// pushMatrix();
// line(0,0,0,-len);
// translate(0,-len);
// branch(len);
// popMatrix();
len *= growth;
pushMatrix();
rotate(curlx-curly);
line(0,0,0,-len);
translate(0,-len);
branch(len,num);
popMatrix();
//len /= growth;
}
}

</nowiki>

Navigation menu