mieki256's diary



2012/02/01(水) [n年前の日記]

#3 [processing] Processingをまだ触っていたり

せっかくUSBカメラを買ってきたので、もうちょっと実験。こんな感じ。


_http://youtu.be/ZKj8iJ5kWh0
import processing.video.*;
/*
 Webカメラのキャプチャテストその2.
 cap.available() を利用してみる。
 sキーを押せば動画保存処理開始
 eキーを押せば動画保存処理終了
 */

Capture cap;
int imgw = 240;
int imgh = 180;
PImage img;
PImage[] p = new PImage[imgh];
int frame;
int rframe;
int idx;
boolean stop_fg;

boolean mov_out = false;
MovieMaker mm;

void setup()
{
  size(240 * 3, 180 * 3);
  background(0);
  cap = new Capture(this, imgw, imgh);
  img = new PImage(imgw, imgh);
  for ( int i=0; i<p.length; i++ ) {
    p[i] = new PImage(imgw, imgh);
  }
  frame = 0;
  rframe = 0;
  idx = 0;
  stop_fg = false;
  mov_out = false;
  frameRate(15);
}

void draw()
{
  if (cap.available()) {
    cap.read(); // Webカメラからキャプチャ
    image(cap, 0, 0); // キャプチャ結果を左画面に描画

    if ( !stop_fg ) {
      int xb = imgw;
      int yb = 0;
      for ( int mode=0; mode <= 5; mode++ ) {
        switch(mode) {
        case 0:
          // 過去画像をラスター単位で遅らせて描画

          // 画像を記憶
          p[idx].copy(cap, 0, 0, imgw, imgh, 0, 0, imgw, imgh);
          int j = idx;
          idx++;
          idx %= p.length;

          // ラスター(?)単位で過去画像をずらしつつ描画
          int h = imgh / 80;
          for ( int y=0; y<imgh; y += h ) {
            copy(p[j], 0, y, imgw, h, xb, yb+y, imgw, h);
            j--;
            if ( j < 0 ) j += p.length;
          }
          break;
        case 1:
          // 疑似多重露光
          int m = 32;
          int n = m - 1;
          for (int y=0; y<imgh; y++) {
            for (int x=0; x<imgw; x++) {
              color c0 = get(xb+x, yb+y);
              color c1 = cap.get(x, y);
              float r = (red(c0) * n + red(c1)) / m;
              float g = (green(c0) * n + green(c1)) / m;
              float b = (blue(c0) * n + blue(c1)) / m;
              set(xb+x, yb+y, color(r, g, b));
            }
          }
          break;
        case 2:
          // ネガポジ反転
          for ( int y=0; y<imgh; y++ ) {
            for (int x=0; x<imgw; x++) {
              color c = cap.get(x, y);
              float r = 255 - red(c);
              float g = 255 - green(c);
              float b = 255 - blue(c);
              set(xb+x, yb+y, color(r, g, b));
            }
          }
          break;
        case 3:
          // モザイク
          int cw = 8;
          noStroke();
          for ( int y=0; y<imgh; y+=cw ) {
            for ( int x=0; x<imgw; x+=cw ) {
              fill(get(x, y));
              rect(xb+x, yb+y, cw, cw);
            }
          }
          break;
        case 4:
          // ラスタスクロールもどき
          for ( int y=0; y<imgw; y++ ) {
            float ang = radians(y * 8 + rframe * 20);
            int rw = 8;
            int x0 = (int)(rw * sin(ang) + rw);
            x0 %= imgw;
            for ( int x=0; x<imgw; x++ ) {
              color c = cap.get(x0, y);
              set(xb+x, yb+y, c);
              x0++;
              x0 %= imgw;
            }
          }
          break;
        case 5:
          // 某シューティングのタイトル画面風
          for ( int y=0; y<imgw; y++ ) {
            int y0 = y + (int)(10 * cos(radians(y * 5 + rframe * 4)));
            if ( y0 < 0 ) y0 = 0;
            if ( y0 >= imgh ) y0 = imgh-1;
            copy(cap, 0, y0, imgw, 1, xb, yb+y, imgw, 1);
          }
          break;
        }
        xb += imgw;
        if ( xb >= width ) {
          xb = 0;
          yb += imgh;
        }
      }
    }
    rframe++;
  } 
  else {
    println("not available frame = "+frame);
  }
  frame++;
  if ( mov_out ) {
    mm.addFrame();
  }
}

// マウスボタンを押した時の処理
void mousePressed() {
  // 画面を停止
  stop_fg = !stop_fg;
}

// キー入力
void keyPressed() {
  if ( key == 's' ) {
    if ( !mov_out ) {
      mm = new MovieMaker(this, width, height, "test.mov", 15, MovieMaker.MOTION_JPEG_A, MovieMaker.BEST);
      mov_out = true;
    }
  } 
  else if ( key == 'e' ) {
    if ( mov_out ) {
      mm.finish();
      mov_out = false;
    }
  }
}

Processingのエディタのフォントを変更。 :

「:」「;」の見分けがつかないので、フォントを変更。自分の環境の場合、
C:\Users\(アカウント名)\AppData\Roaming\Processing\preferences.txt
が設定ファイルだった。xyzzyで開いて、
editor.font=Ricty,plain,13
に修正。

Rictyフォントについては、VMware PlayerでUbuntuを動かして、そこで作成したものをWin7機にインストール済み。

ぬいぐるみの類が欲しいかもしれない。 :

カメラの被写体として適切なモノが部屋の中に見当たらず。ぬいぐるみでもあれば便利なんだろうけど。

自分の顔を映す…のはちょっと気が引ける。玩具店でプリキュアのお面でも買ってこようか。嘘。というか、そもそも須賀川市に玩具店は無かったような気もする。ダイソーあたりでその手の品が売ってないかな。今度行ったときに探してみようか。

上から紐で吊るした操り人形でもあれば便利かもしれない。自作してみようかしら。…何か本筋とずれてきている気もするけど。

以上です。

過去ログ表示

Prev - 2012/02 - Next
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project