2014/11/16

processing-2.2.1

 前回、processingの記事を書いたのが5月17日なので、Processing関連の記事は半年ぶりになります。

 いつの間にやらprocessing-2.2.1も出ておりまして、まえのバージョンで気に入らなかった日本語表示も治ってますね。


前のバージョンだと

 Pc222


こんなんだった日本語表示も・・・

processing-2.2.1では


Pc221


きちんと表示されております。

しかし、またちょいちょい変わってますね。
そのスピード感にはついていけない気もするのですが、日本語表示が治っているので使ってみましょう。

さて、前回の続きをやるにしても、GSVdeoを使えるようにしなければならないと・・・


ほとんど作業メモのようなブログですが、意外と役に立ちます。
半年前のこととか覚えてませんし。

| | コメント (0) | トラックバック (0)

2014/05/17

【Processing】 class?

 先日、友人から 「雑なプログラムだな、classとか関数とか使えよ」というお言葉がありました。

 ですがプログラムを学んだことがあるわけではないので良く解りません。
 とりあえずググってみてそれらしきものを書いてみます。
 
 
    ◇class_test04


int speed = 5;  //オブジェクトのスピード
int x = 0;  //オブジェクトのx座標

Circle c1,c2;

void setup() {
  size(400, 400);
  noStroke();      //輪郭を描かない
  smooth();        //オブジェクトにアンチエイリアスをかける
  fill(0);      //オブジェクトを黒で塗りつぶす

    c1 = new Circle(5);
    c2 = new Circle(10);

}

void draw() {
  background(255);  //画面の色を更新

  ellipse(x, height/4, c1.xSize, c1.ySize); 
  ellipse(x, height/2, c2.xSize, c2.ySize);
  x = x + speed;    //x座標にspeedの値を足す
  if (x >=width) {    //もし、xの値がよ画面の幅を超えたら、xを0に戻す
    x = 0;
  } 
}

class Circle {
  int xSize,ySize;

  public Circle (int x) {
    xSize = x*3;
    ySize = x*2;
  }
}

| | コメント (0) | トラックバック (0)

2014/04/23

【Processing】 JMyronでWebカメラを使う

 Webカメラを使うにあたり標準のライブラリの使い方GSVideoを利用した使い方は以前ご紹介しました。

 でもまだあるんですよねぇ、ということで今回はJMyronを使ってみます。

 
 

 まずはインストールから。
 Myron WebCamXtraからProcessingのライブラリをダウンロード。
 

 解凍して出来上がるJMyronフォルダをProcessingの"modes\java\libraries\"にコピー。
 Extra DLLsフォルダ内のDLLをprocessing.exeのあるフォルダにコピーします。

 これで使えるようになります。
 JMyron Examplesの中のサンプルを実行してみると良いでしょう。

 ※環境によってはmsvcr71.dlと msvcp71.dllも必要な場合があるようです。
   私のは不要だったので、確認してません。

 
 

 ということでサンプルをちょこっといじってテストしてみました。

◇test054

//test054

import JMyron.*;

JMyron m;//a camera object
PImage cam;

void setup(){
  size(320,240);
  m = new JMyron();//make a new instance of the object
  m.start(width,height);//start a capture at 320x240

  m.findGlobs(0);//disable the intelligence to speed up frame rate
  println("Myron " + m.version()); 

  cam = new PImage(width,height);
}

void draw(){
  m.update();//update the camera view
  cam.pixels = m.image(); //get the normal image of the camera
  set(0,0,cam);
}

void mousePressed(){
  m.settings();//click the window to get the settings
}

public void stop(){
  m.stop();//stop the object
  super.stop();
}

 GSVideoより起動が早いです。
 ちょっと使い込んでみたいと思います。
 

| | コメント (0) | トラックバック (0)

2014/03/11

【Processing】カラートラッキング

 Webカメラを使ったカラートラッキングのプログラムです。

 ポイントは、ラべリングしつつ最初のコーンをターゲットとして固定しているところです。

 
 
 あープログラムって楽しい!

| | コメント (5) | トラックバック (0)

2014/03/07

【Processing】音声ファイルの再生

 ふとプログラムに"しゃべらせたい"と思ったので、音声ファイルの再生の方法を調べてみました。
 processingには標準のライブラリとして"minim"というものがあるらしく、これを使えば簡単に音声ファイルを再生できるようです。  

 手始めにWindowsにサンプルとして入っていた"Sleep Away.mp3"を再生してみます。

◇test053:音声ファイルの再生

//test053:音声ファイル再生
import ddf.minim.*;

Minim minim;  //Minim型変数であるminimの宣言
AudioPlayer player;  //サウンドデータ格納用の変数

void setup(){
  minim = new Minim(this);  //初期化
  player = minim.loadFile("Sleep Away.mp3");  //Sleep Away.mp3をロードする
  player.play();  //再生
}

void draw(){
}

void stop(){
  player.close();  //サウンドデータを終了
  minim.stop();    //ライブラリの使用を停止
  super.stop();   
}

 さくっと再生できました。
 音声ファイルがあればプログラムにしゃべらせるのも難しくなさそうです。

| | コメント (0) | トラックバック (0)

2014/03/03

【Processing】キーボード入力(カーソルキー)の判定 その2

 以前にもキー入力について書いたのですが、違うアプローチもあるのでそちらも書いておきます。

//test051
void draw(){
  println("draw");
}

void keyPressed() {
  if ( key == CODED ) {      
    if ( keyCode == UP ) {    
       println("↑");
    }
  }
}

test051は以前にも書いた関数を利用したキー入力の取得。
そして次はdrawの中にキー判定を書いた場合。

//test052
void draw(){
  println("draw");
  if ((keyPressed == true) && (keyCode == UP)) {
    println("↑");
  }
}

↑キーを押しっぱなしにした場合、出力結果が異なるのが今回のポイントです。 keyPressed()はイベントの発生タイミングが良く解らんので、自分の利用方法に合わない場合も出てくるかもしれないという話です。

| | コメント (0) | トラックバック (0)

2014/02/16

【Processing】設定ファイルの読み込みと書き込み

 今週も大雪ですね。
 首都圏のこの状況をみると、雪国はやはり雪に対して膨大な労力とお金をかけて生きてるんだと実感します。

 ということで外に出る必要がない本日も、家に引きこもってプログラミングです。

 今回はカラートラッキングするときのフィルタのかけ方などの設定値を実行とともに読み込み、プログラムの中で設定し直した値は終了時に保存するようなファイル操作をしたいと思います。

 ファイルの読み込みと書き込みの方法はいくつかあるようですが、詳しく見てないので違いがよくわかっていないのですが、とりあえず動いてるってことで良しとします。

  ◇test050
  実行環境:Processing 2.1.1

//test050

int tolerance;
float blurLevel;
int posterizeValue;
int loLimit;

void setup()
{
  readConfigration();
}

void draw()
{  
  println(tolerance);
  println(blurLevel);
  println(posterizeValue);
  println(loLimit);

  loLimit++;  
  noLoop();
}

void exit(){
  writeConfigration();
  super.exit();
}

///////////////////////////
//キー入力の処理
///////////////////////////
void keyPressed(){

  if(key == ' '){
    exit();
  }
}

///////////////////////////////
//設定ファイルを読み込む関数
///////////////////////////////
void readConfigration(){
  // text.textの中身を読み込む
  BufferedReader reader;
  reader = createReader("config.txt");
  String line;
  boolean z = true;

  while(z){
    // IOException例外を投げる可能性があるので、try~catchを記述しておく
    try{
      line = reader.readLine();
    }
    catch (IOException e){
      line = null;
    }
    if (line == null){
      z = false;// 読み込むデータが無いならループを止める
    }else{
      String point[] = split( line,'=');
      println("line:"+line);

      if(point[0].equals("tolerance") == true){
        tolerance = int(point[1]);
      }else if(point[0].equals("blurLevel") == true){
        blurLevel = float(point[1]);
      }else if(point[0].equals("posterizeValue") == true){
        posterizeValue = int(point[1]);        
      }else if(point[0].equals("loLimit") == true){
        loLimit = int(point[1]);
      }   
    }   
  }
}

///////////////////////////////
//設定ファイルへ書き込む関数
///////////////////////////////
void writeConfigration(){
  PrintWriter writer;
  writer = createWriter("config.txt");

  writer.println("tolerance="+tolerance);
  writer.println("blurLevel="+blurLevel);
  writer.println("posterizeValue="+posterizeValue);
  writer.println("loLimit="+loLimit);

  writer.flush(); // バッファに溜まった文字列を出力先に移す
  writer.close(); // 閉じる  
}

 

あらかじめ"config.txt"を用意しておく必要があります。

▼config.txtの中身

tolerance=15
blurLevel=1.0
posterizeValue=4
loLimit=62

 

◇実行結果

line:tolerance=15
line:blurLevel=1.0
line:posterizeValue=4
line:loLimit=62
15
1.0
4
62

出力されたファイルの"loLimit"は63になっています。

| | コメント (0) | トラックバック (0)

2014/02/09

【Processing】二値化した画像のラべリング

 本日東京は大雪でございます。

 道産子からするとなんでもないんですけど、周りの人が動けなくなるのです。雪はどうにかなりますが、人はどうにもなりません。
 ということで、本日はプログラミング。     

 webカメラの起動がいちいち遅いので、とりあえず静止画から加工するラべリングプログラムを作ります。

▼元画像
Pc142

◇test044  
  実行環境:Processing 2.1.1   

  
//test044

int imgWidth = 320;     
int imgHeight = 240;      

boolean bins[];    //二値化に使う変数

int tolerance=15;    //色許容値用の変数
float blurLevel = 1;  //ぼかし具合の設定
color targetColor=color(255,0,0);    //ターゲットとする色用の変数

boolean detection=false;    //物体検知のフラグ 

PImage binImage; 

PImage cam; 

PrintWriter writer01;
PrintWriter writer02;

void setup(){ 
size(imgWidth*2, imgHeight*2);  

writer01 = createWriter("test01.CSV");
writer02 = createWriter("test02.CSV");

  binImage = new PImage(imgWidth, imgHeight);
  bins = new boolean[imgWidth*imgHeight];

   cam = loadImage("t37_img02.JPG");

    set(imgWidth,0,cam);  //入力画面を右上に表示
    cam.filter(BLUR,blurLevel);
    cam.filter (POSTERIZE, 4);
    set(0, 0,cam);    //加工済み画面を左上に表示

   detection=false;//物体検知のフラグをfalse(検知なし)にしておく

    for(int i=0 ; i< w_img*h_img ; i++)  //画面全体のピクセル数だけ繰り返し処理
    {

      //物体の色と各ピクセルの色の差を求める(RGB3色分)
      float difRed=abs(red(targetColor)-red(cam.pixels[i]));
      float difGreen=abs(green(targetColor)-green(cam.pixels[i]));
      float difBlue=abs(blue(targetColor)-blue(cam.pixels[i]));


      if (difRed < tolerance && difGreen < tolerance && difBlue < tolerance){
        detection=true;
        bins[i] = true;
        binImage.pixels[i] = color(targetColor);    //ターゲットーをセット

      }else{
        bins[i] = false;    //ターゲット色がなければ偽
        binImage.pixels[i] = color(0);    //blackをセット
      }      
    }

  set(0,imgHeight,binImage);


  ///////////////////////////////////////////
  //4近傍(きんぼう)ラベリング処理
  ///////////////////////////////////////////
  int label = 0;
  int labelNumber[][];    //ラベル番号を格納する変数
  int dst[];  //ルックアップテーブル用
  boolean vic;

  labelNumber = new int[imgWidth][imgHeight];    //Label/配列の準備
  dst = new int[imgWidth*imgHeight];
  dst[0] = 0;

  if(bins[0]) labelNumber[0][0] = label; //画像の左上の処理

  for(int i = 1; i < imgWidth; i++){ // 1番上の列を処理
    if(bins[i]){ //ターゲット色にの時
      if(!bins[i-1]){    //左隣りが黒の時
        labelNumber[i][0] = ++label; // 新しいラベルを付ける
      }
      else{
        labelNumber[i][0] = labelNumber[i-1][0]; // ラベルのコピー
      }
    }
  }
  //2段目以降の処理(作成中)  
  for(int y = 1; y < imgHeight; y++){
    for(int x = 0; x < imgWidth; x++){
      int i = x+y*imgWidth;
      int j =0;
      if(bins[i]){ // 黒の時
        if(!bins[i-1] && !bins[i-imgWidth] && !bins[i-imgWidth+1] && !bins[i-imgWidth-1]){
          labelNumber[x][y] = ++label; // 新しいラベル
          dst[label]=label;    //ルックアップテーブルの生成
        }
        else{
          vic = false;    //4近傍に値があるかどうかを格納しておく          
          if(bins[i-1]){    //左のピクセルがラべリングされている場合
           labelNumber[x][y] = labelNumber[x-1][y]; //同じ番号を割り振る
           vic = true;
          }
          if(bins[i-imgWidth]){    //上のピクセルがラべリングされていた場合
            if(!vic){    //ラべリングの有無の確認
              labelNumber[x][y] = labelNumber[x][y-1];    //上のラベル番号を割り振る
              vic = true;
            }
            else{
              j=min(labelNumber[x][y-1],labelNumber[x][y]);    //より小さい値を抽出
              dst[max(labelNumber[x][y-1],labelNumber[x][y])]=j;  //ルックアップテーブルを小さい方で書き換え
              labelNumber[x][y]=j;    //ラベルに小さい方の番号を割り振る
            }
          }            
          if(bins[i-imgWidth+1]){    //右上のピクセルがラべリングされていた場合
           if(!vic){
            labelNumber[x][y] = labelNumber[x+1][y-1]; // 右上のラベル番号を割り振る
            vic = true;
           }
           else{
             j=min(labelNumber[x+1][y-1],labelNumber[x][y]); //より小さい値を抽出
             dst[max(labelNumber[x+1][y-1],labelNumber[x][y])]=j;    //ルックアップテーブルを小さい方で書き換え
             labelNumber[x][y]=j;   //ラベルに小さい方の番号を割り振る
           }
          }           
          if(bins[i-imgWidth-1]){
            if(!vic){
              labelNumber[x][y] = labelNumber[x-1][y-1]; // 左上
              vic = true;
            }
            else{
              j=min(labelNumber[x-1][y-1],labelNumber[x][y]);
              dst[max(labelNumber[x-1][y-1],labelNumber[x][y])]=j;    //ルックアップテーブルを小さい方で書き換え
              labelNumber[x][y]=j;   //ラベルに小さい方の番号を割り振る
            }
          }
        }
      }
    }
  }

    println("label: "+label);
  for(int i = 1; i<=label; i++){
    println("変換前dst:"+dst[i]);
  }


  ////////////////////////////////////////////
  //ルックアップテーブルの詰め 
  ////////////////////////////////////////////
  int tmp;    //番号用変数
  tmp = 0;
  for(int i = 1; i <=label ; i++){ 
    if(tmp < dst[i]){  //変数よりラベルが大きい場合
      if(tmp+1 == dst[i])tmp = dst[i];   
      else{    //それ以外の場合(2つ以上大きい値)
        tmp++;   
        dst[i] = tmp;  
      }
    }
  }

  //書き換え前のラベルのファイル出力
  for(int y = 0 ; y < imgHeight ; y++){
    for(int x = 0; x< imgWidth  ; x++){
      writer01.print(labelNumber[x][y]+",");
    }
    writer01.println();
    writer01.flush();
  }  

  ////////////////////////
  //ラベルの書き換え
  ////////////////////////
  for(int y = 0 ;  y < imgHeight; y++){
    for(int x = 0;  x < imgWidth ; x++){
      labelNumber[x][y] = dst[labelNumber[x][y]];
    }
  }

  ////////////////////////
  //ラベルの情報格納
  ////////////////////////
  int labelElements[][];  //各ラベルの情報を格納する変数(lnum、xmin、ymin、xmax、ymax、pnum)
  boolean fLabel[];
  int lnum = 0;
  int xmin = 1;
  int ymin = 2;
  int xmax = 3;
  int ymax = 4;
  int pnum = 5;

  //tmpの中にラベルの最大値は入っている
  labelElements = new int[tmp+1][6];
  fLabel = new boolean[tmp+1];

  println("tmp;"+tmp);

    for(int i = 0 ;i<=tmp;i++){
    labelElements[i][lnum]=i;    //ラベル番号を入れる
    }    

  for(int y = 0 ;  y < imgHeight; y++){
    for(int x = 0;  x < imgWidth ; x++){
      if(labelNumber[x][y]>0){
          for(int i=1;i<=tmp;i++){
            if(labelNumber[x][y]==i){    //iのナンバーのラベルがあった時
              if(!fLabel[i]){
                fLabel[i]=true;
                labelElements[i][xmin]=x;
                labelElements[i][ymin]=y;
                labelElements[i][xmax]=x;
                labelElements[i][ymax]=y;
                labelElements[i][pnum]=++labelElements[i][pnum];                  
              }else{
                labelElements[i][xmin]=min(x,labelElements[i][xmin]);
                labelElements[i][ymin]=min(y,labelElements[i][ymin]);
                labelElements[i][xmax]=max(x,labelElements[i][xmax]);
                labelElements[i][ymax]=max(y,labelElements[i][ymax]);
                labelElements[i][pnum]=++labelElements[i][pnum];
              }          
          }
        }
      }
    }
  }

  //ターゲットを枠で囲む
  int margin =3;

  for(int i = 1 ;i<=tmp;i++){
    noFill();
    stroke(255);
    text(i,labelElements[i][xmin]-margin*3,labelElements[i][ymin]+imgHeight-margin);
    rect(labelElements[i][xmin]-margin,
    labelElements[i][ymin]+imgHeight-margin,
    labelElements[i][xmax]-labelElements[i][xmin]+margin*2,
    labelElements[i][ymax]-labelElements[i][ymin]+margin*2);
  }

 //デバッグ用
  println("label: "+label);
  for(int i = 1; i<=label; i++){
    println("変換後dst:"+dst[i]);
  }

 //ファイル出力
  for(int y = 0 ;  y < imgHeight; y++){
    for(int x = 0;  x < imgWidth ; x++){
      writer02.print(labelNumber[x][y]+",");
    }
    writer02.println();
    writer02.flush();
  }         
}

▼実行結果

Pc141

 動きを確認するためにCSVへ出力しているのですが、当初すべてのピクセルが出力されず困りました。
 原因は"flush()"を使っていなかったためなんですけどね。
 320×240の画像を格納するにはバッファが足りなったようなので、1行毎に書き出してます。

 ラベル3はすごく小さな塊なのですが、カラートラッキングをするに当たりどうしていくかはおいおい考えようと思います。

 ラべリングについてはこちらを参考にさせていただきました。   

 

 長いプログラムを載せる気はなかったのだが・・・

メモ:< img>に注意

| | コメント (0) | トラックバック (0)

2014/02/01

【Processing】色識別

 昼間なのに眠気を覚え、3時間近く寝てしまいました。     ねむい・・・
  
 ということで前回Webカメラを使えるようにしたので、今回はWebカメラの画像から色を抽出してみます。
 機能としては以下。

 ・画面に映っている目標物をマウスでクリックして色を抽出する。
 ・抽出された色と同じ色をすべて抽出し別画面にターゲットとして描画する。
 ・ターゲットの位置を認識し四角で囲む。

   プログラムはこちらを参考にさせていただきました。

 

◇test034
  実行環境:Processing 2.1.1
  Webカメラ:Logicool HD Pro Webcam C910

//test034
import codeanticode.gsvideo.*;

int w_img = 320;       
int h_img = 240;           
int p_text_size = 30;      
int fps = 15;

int tolerance=15;//色許容値用の変数(後で調整可)
color targetColor=color(255,0,0);//物体の色用の変数(後で変更可)

color white = color(255, 255, 255);

int x,y,x1,y1,x2,y2,x3,y3,x4,y4;//図形座標用変数
int xmin=w_img,xmax=0;//左端X座標、右端X座標
int ymin=h_img,ymax=0;//上端Y座標、下端Y座標 

int a=5;//余白
int b=15;//行間

boolean detection=false;//物体検知のフラグ 

GSCapture cam;

void setup() {
  size(w_img, h_img*2);  // 画面サイズの設定
  String[] cameras = GSCapture.list();
  if (cameras.length == 0){
    println("There are no cameras available for capture.");
    exit();
  } else {
    println("Available cameras:");
    for (int i = 0; i < cameras.length; i++) {
      println(cameras[i]);      // カメラの名
    }

    cam = new GSCapture(this, w_img, h_img, cameras[0]);
    cam.start();
  }
}

void draw() {
  frameRate(fps);      // フレームレートの設定

  fill(0);
  rect(0, h_img, w_img, h_img*2);

  if (cam.available()) {
    cam.read();       // カメラ画像を読み込んで
    set(0, 0,cam); // 画面に表示 

   detection=false;//物体検知のフラグをfalse(検知なし)にしておく

    for(int i=0 ; i< w_img*h_img ; i++)  //画面全体のピクセル数だけ繰り返し処理
    {

      //物体の色と各ピクセルの色の差を求める(RGB3色分)
      float difRed=abs(red(targetColor)-red(cam.pixels[i]));
      float difGreen=abs(green(targetColor)-green(cam.pixels[i]));
      float difBlue=abs(blue(targetColor)-blue(cam.pixels[i]));

      if (difRed < tolerance && difGreen < tolerance && difBlue < tolerance){
        detection=true;

        //左端、右端のX座標、上端、下端のY座標を導く
        //今回の値と今までの値を比較し、最小値、最大値を調べる
        xmin=min(i%w_img,xmin);//左端(X最小値)
        xmax=max(i%w_img,xmax);//右端(X最大値)
        ymin=min(i/w_img,ymin);//上端(Y最小値)
        ymax=max(i/w_img,ymax);//下端(Y最大値)

        set(i%w_img,i/w_img+h_img,targetColor);

      }
    }

    if(detection==true){//物体検知有りの場合

      x1=xmin;
      x2=xmax;
      y1=ymin;
      y2=ymax;

      //左端、右端、上端、下端の座標値を初期化しておく
      xmin=w_img;
      xmax=0;
      ymin=h_img;
      ymax=0;
    }
  }

  x3=x1-a;
  y3=y1+h_img-a;
  x4=x2-x1+a*2;
  y4=y2-y1+a*2;


  noFill();
  stroke(255);
  rect(x3,y3,x4,y4);

  String s;//物体検知有無表示の文字列変数
  if(detection==true){//物体検知有りの場合
    s="detected";//表示:「検知」
  }else{
    s="none";//表示:「なし」
  }

  //以下は各値の表示
  fill(targetColor);//指定した物体の色
  rect(0,h_img,b,b);//矩形表示
  text(tolerance+": "+s,20,h_img+b);//文字列表示(許容値:物体検知有無)
  text(x1+":"+y1+":"+x2+":"+y2,10,h_img+b*2);
  text(x3+":"+y3+":"+x4+":"+y4,10,h_img+b*3);

}


void mousePressed(){//クリックしたら
  //マウス座標上のピクセルの色(物体の色)を記憶しておく
  targetColor=cam.pixels[mouseX+mouseY*w_img];
}

void keyPressed(){

  if(key == ' '){
    exit();
  }
  if(key==CODED){
    if(keyCode==LEFT){//左キーを押した場合
      tolerance-=1;   //許容値を-1する
    }
    if(keyCode==RIGHT){//右キーを押した場合
      tolerance+=1;    //許容値を+1する
    }
  }
}

◇実行結果
Pc139

 
 
 赤いコーンをうまく認識しています。
 当初の要件は満たしていますが・・・・コーンを二個置くとこんな感じに・・・

 

Pc140

 今のプログラムでは、ターゲット以外に同色の物体が画面に入ると、位置がわからなくなってしまいますので今後の課題とします。

| | コメント (0) | トラックバック (0)

2014/01/28

【Processing】 GSVideoでWebカメラを使う

 今日は体調不良。少し疲れがたまっているのかもしれない。

 さて、昨年の記事でProcessingでwebカメラを使う方法を書きました。
 Processingのバージョンの違いによってプログラムの書き方が少し変わったと書いたのですが、実はもう一つ違いがあって解決策を探さねばと思っておりました。

 実際試した方は感じたと思うのですが、バージョン2.xの方は遅延がかなり目立ちます。
 リアルタイムの処理をしようと思うのをためらうレベル。

 ということで、今回はGSVdeoを使ってWebカメラを表示してみます。
 実行環境はProcessing 2.1.1です。

 GSVideoはここからダウンロードし、processingのプログラム配下にあるmodes\java\librariesにコピーしておきます。
 これでprocessingを起動すると[Sketch] -[Import library]から選択できるようになります。

 以下はソースコード

◇test033

//test033
import codeanticode.gsvideo.*;

int w_img = 640;       
int h_img = 480;           
int p_text_size = 30;      
int fps = 24;

GSCapture cam;

void setup() {
  size(w_img, h_img);  // 画面サイズの設定
  String[] cameras = GSCapture.list();
  if (cameras.length == 0){
    println("There are no cameras available for capture.");
    exit();
  } else {
    println("Available cameras:");
    for (int i = 0; i < cameras.length; i++) {
      println(cameras[i]);      // カメラの名
    }

    cam = new GSCapture(this, w_img, h_img, cameras[0]);
    cam.start();
  }
}

void draw() {
  frameRate(fps);      // フレームレートの設定

  if (cam.available()) {
    cam.read();       // カメラ画像を読み込んで
    image(cam, 0, 0); // 画面に表示
  }
}

//スペースキーで終了
void keyPressed() {
  if(key == ' ') exit();
}

 遅延も気になるレベルではなく快適に動きます。

| | コメント (4) | トラックバック (0)

より以前の記事一覧