ColorTracking.pde
import processing.video.*; Capture cap; color target = color(255,0,0); // 追跡する色 void setup(){ size(640, 480); // 画面サイズ smooth(); // 描画を滑らかに String[] cams = Capture.list(); // 接続されている全カメラ名を取得 cap = new Capture(this, cams[0]); // カメラのキャプチャ cap.start(); } void draw() { if (cap.available()){ // 変数の宣言 int x = width/2; // 追跡対象のx座標 int y = height/2; // 追跡対象のy座標 int dmax = 21; // 追跡対象判定の閾値 int xmin = width; // 追跡する画素のx座標最小値 int ymin = height; // 追跡する画素のx座標最大値 int xmax = 0; // 追跡する画素のy座標最小値 int ymax = 0; // 追跡する画素のy座標最大値 cap.read(); // カメラ映像の取得 image(cap, 0, 0); // カメラ映像の表示 // 色検出 for(int i = 0; i < width*height; i++){ // 目標の色との差を計算 float dr = abs( red(target) - red(cap.pixels[i]) ); float dg = abs( green(target) - green(cap.pixels[i]) ); float db = abs( blue(target) - blue(cap.pixels[i]) ); // 差がdmax以下なら目標物として認識 if(dr < dmax && dg < dmax && db < dmax){ xmin = min(i%width,xmin); // 追跡する画素のx座標最小値 xmax = max(i%width,xmax); // 追跡する画素のx座標最大値 ymin = min(i/width,ymin); // 追跡する画素のy座標最小値 ymax = max(i/width,ymax); // 追跡する画素のy座標最大値 } } x = (xmin+xmax)/2; // 追跡対象のx座標を計算 y = (ymin+ymax)/2; // 追跡対象のy座標を計算 stroke(255,0,0); // 線色 strokeWeight(5); // 線の太さ noFill(); // 塗りつぶしなし rect(x-25, y-25, 50, 50); // 追跡対象の中心に矩形を描画 line( x, 0, x, height); line( 0, y, width, y); } } // マウスクリックした画素の色を追跡対象にする void mousePressed(){ target = cap.pixels[mouseX+mouseY*width]; }