2013年11月1日金曜日

11/11の授業:Processing(Webカメラをつかった色認識)

次回は、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 件のコメント:

コメントを投稿