I made a program that will simulate a snowy environment around you!
Press [SPACE] to begin, it will draw a blue background behind you and as long as you hold down the space bar, snow will fall.
Press ‘r’ to reset the blue background.
A challenge I faced was keeping the blue background off of the foreground. For some reason if I kept making the background blue instead of once in a while, the person in the foreground becomes blue as well. I think it might just be my computer I am not sure.
I placed three different types of snowflake images in my /data folder and the Snowpic class randomly chooses which one to be
The three snowflake images:
Code:
SnowGenerator
import processing.video.*; Capture video; PImage backgroundImage; boolean first = true; ArrayList<Snowpic> snows = new ArrayList(); // How different must a pixel be to be a foreground pixel float threshold = 20; int count = 0; void setup() { size(640, 480); video = new Capture(this, width, height); video.start(); // Create an empty image the same size as the video backgroundImage = createImage(video.width, video.height, RGB); } void captureEvent(Capture video) { // Read image from the camera video.read(); } void draw() { //background(1); loadPixels(); video.loadPixels(); backgroundImage.loadPixels(); for (int x = 0; x < video.width; x ++ ) { for (int y = 0; y < video.height; y ++ ) { int loc = x + y*video.width; // Step 1, what is the 1D pixel location color fgColor = video.pixels[loc]; // Step 2, what is the foreground color // Step 3, what is the background color color bgColor = backgroundImage.pixels[loc]; // Step 4, compare the foreground and background color float r1 = red(fgColor); float g1 = green(fgColor); float b1 = blue(fgColor); float r2 = red(bgColor); float g2 = green(bgColor); float b2 = blue(bgColor); float diff = dist(r1, g1, b1, r2, g2, b2); // Step 5, Is the foreground color different from the background color if (diff > threshold) { // If so, display the foreground color pixels[loc] = fgColor; } else { //pixels[loc] = bgColor; // If not, display green pixels[loc] = color(#19325A); } } } updatePixels(); for (int i = 0; i < snows.size(); i++) { snows.get(i).draw(); if (snows.get(i).isDone()) { snows.remove(i); } } //updatePixels(); } void keyPressed() { if (key == ' ') { count++; Snowpic sp = new Snowpic(int(random(0, 640)), 0); snows.add(sp); } if (count == 1 || key == 'r') { backgroundImage.copy(video, 0, 0, video.width, video.height, 0, 0, video.width, video.height); backgroundImage.updatePixels(); } }
SnowPic:
class Snowpic { String[] snowflakes = {"snowflake1.png", "snowflake2.png", "snowflake3.png"}; PImage img; int x; int y; boolean done; Snowpic(int x, int y) { this.x = x; this.y = y; done = false; img = loadImage(snowflakes[int(random(0, 3))]); } void draw() { image(img, x, y); y+=5; if (y>=480) { done = true; } } boolean isDone() { return done; } }
Nice. I am jealous of your snow and cold.