次回は、Webカメラ(Processing)を用いて、色認識のプログラムの実験をします。
必要なもの:
・ノートパソコン (Processingをインストール済み)
・Webカメラ(ノートパソコン内蔵型も可)
なお、前回のマトリクスLED演習で未消化の部分があれば随時補習します。
サンプル1:
部屋を暗くして、懐中電灯の点光源を動かした軌跡を画面に描きます。画面クリックで背景を黒にリセットします。
import processing.video.*;
Capture video;
int w=640;
int h=480;
void setup() {
size(w, h);
video = new Capture(this, w, h);
video.start();
background(0);
}
void draw() {
if(video.available()){
video.read();
}
loadPixels();
for(int i=0;i<w*h;i++){
if(brightness(video.pixels[i])>=250){
pixels[i]=color(255,0,0);
}
}
updatePixels();
}
void mousePressed(){
background(0);
}
サンプル2:
目立つ色のボールなどを用意して、画面上でそのボールをクリックして、いったん対象となる色を覚えさせます(画面左上に色表示)。そのボールを動かせば、画面上の円が追跡します。矢印キーの左右をつかって、色の許容範囲を設定できます(画面左上の数値:初期値20)。数値を大きくすれば、近似色の範囲が大きくなります。
import processing.video.*;
Capture video;
int w=320;
int h=240;
int tolerance=20;
PFont font;
color targetColor=color(255,0,0);
boolean videoImage=true;
void setup(){
size(w, h);
smooth();
video = new Capture(this, w, h);
video.start();
font=createFont("Monaco",10);
textFont(font);
noStroke();
}
float x;
float y;
int sumX,sumY;
int pixelNum;
boolean detection=false;
void draw() {
if(video.available()){
video.read();
if(videoImage){
image(video, 0, 0);
}else{
background(0);
}
detection=false;
for(int i=0;i<w*h;i++){
float difRed=abs(red(targetColor)-red(video.pixels[i]));
float difGreen=abs(green(targetColor)-green(video.pixels[i]));
float difBlue=abs(blue(targetColor)-blue(video.pixels[i]));
if(difRed<tolerance && difGreen<tolerance && difBlue<tolerance){
sumX+=(i%w);
sumY+=(i/w);
pixelNum++;
detection=true;
}
}
if(detection){
x=sumX/pixelNum;
y=sumY/pixelNum;
sumX=0;
sumY=0;
pixelNum=0;
}
}
fill(255,0,0);
ellipse(x,y,20,20);
fill(targetColor);
rect(0,0,10,10);
text(tolerance,20,10);
String s;
if(detection){
s="detect";
}else{
s="none";
}
text(s,40,10);
}
void keyPressed(){
if(key=='v'){
if(videoImage){
videoImage=false;
}else{
videoImage=true;
}
}
if(key==CODED){
if(keyCode==LEFT){
tolerance-=1;
}
if(keyCode==RIGHT){
tolerance+=1;
}
}
}
0 件のコメント:
コメントを投稿