Skip to content

Instantly share code, notes, and snippets.

@miminashi
Created September 8, 2011 17:39
Show Gist options
  • Save miminashi/1204047 to your computer and use it in GitHub Desktop.
Save miminashi/1204047 to your computer and use it in GitHub Desktop.
//
// 元ネタ: http://kousaku-kousaku.blogspot.com/2008/11/import-processing.html
// トラッキングした軌跡を表示するようにした
//
import processing.video.*;
Capture video;
PFont font;
int w=320;
int h=240;
//前回画面ピクセル色を保存するための配列を用意
color[] exColor=new color[w*h];
//許容値の変数:50に設定しておく
int tolerance=50;
int sumX,sumY; //平均値を求めるための合計座標値の変数
int pixelNum; //変化のあったピクセルを数えるための変数
float x,y; //座標値の変数
float filterX,filterY; //フィルタをかけた座標値の変数
boolean movement=false; //動体の有無のフラグ
PGraphics canvas; //Canvas for art
void setup(){
size(w, h);
video = new Capture(this, w, h);
font=loadFont("Monaco-10.vlw");
textFont(font);
rectMode(CENTER);
noStroke();
//canvas = createImage(width, height, ARGB);
canvas = createGraphics(width, height, P3D);
}
void draw() {
if(video.available()){
background(0);
video.read();
set(0,0,video);//カメラ映像表示
loadPixels();//画面内ピクセルをロードしておく
movement=false;//動体のフラグをfalseに戻しておく
for(int i=0;i<w*h;i++){
//前回と今回の画面のピクセルの各色の差を求める
float difRed=abs(red(exColor[i])-red(video.pixels[i]));
float difGreen=abs(green(exColor[i])-green(video.pixels[i]));
float difBlue=abs(blue(exColor[i])-blue(video.pixels[i]));
//色の差が許容値以上の場合(動体がある場合)
if(difRed>tolerance && difGreen>tolerance && difBlue>tolerance){
movement=true;//動体有りのフラグをtrueにしておく
pixels[i]=color(0,255,0);//そのピクセルを緑にする
sumX+=i%w;//平均値を求めるためにX座標値を加算する
sumY+=i/w;//平均値を求めるためにY座標値を加算する
pixelNum++;//変化のあったピクセル数を数える
}
//次回ループのために今回の画面を前回の画面として保存しておく
exColor[i]=video.pixels[i];
}
//動体があった場合(画面内に変化があった場合)
if(movement==true){
updatePixels();//画面内ピクセルをアップデート
x=sumX/pixelNum;//X座標平均値を求める
y=sumY/pixelNum;//Y座標平均値を求める
//各変数を初期化しておく
sumX=0;
sumY=0;
pixelNum=0;
}
}
filterX+=(x-filterX)*0.3; //X座標にフィルタをかける
filterY+=(y-filterY)*0.3; //Y座標にフィルタをかける
/*
fill(255,0,0);
rect(filterX,filterY,20,20);//正方形描画
*/
//canvas.updatePixels();
canvas.beginDraw();
canvas.fill(255, 0, 0);
canvas.rect(filterX, filterY, 20, 20);
canvas.endDraw();
image(canvas, 0, 0);
text(tolerance,10,10); //許容値を表示
}
void keyPressed(){
if(key=='c'){
video.settings();//カメラセッティング
}
if(key==CODED){
if(keyCode==LEFT){
tolerance-=1;//許容値を-1する
}
if(keyCode==RIGHT){
tolerance+=1;//許容値を+1する
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment