2012/02/01(水) [n年前の日記]
#3 [processing] Processingをまだ触っていたり
せっかくUSBカメラを買ってきたので、もうちょっと実験。こんな感じ。
_http://youtu.be/ZKj8iJ5kWh0
_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のエディタのフォントを変更。 :
「:」「;」の見分けがつかないので、フォントを変更。自分の環境の場合、
Rictyフォントについては、VMware PlayerでUbuntuを動かして、そこで作成したものをWin7機にインストール済み。
C:\Users\(アカウント名)\AppData\Roaming\Processing\preferences.txtが設定ファイルだった。xyzzyで開いて、
editor.font=Ricty,plain,13に修正。
Rictyフォントについては、VMware PlayerでUbuntuを動かして、そこで作成したものをWin7機にインストール済み。
◎ ぬいぐるみの類が欲しいかもしれない。 :
カメラの被写体として適切なモノが部屋の中に見当たらず。ぬいぐるみでもあれば便利なんだろうけど。
自分の顔を映す…のはちょっと気が引ける。玩具店でプリキュアのお面でも買ってこようか。嘘。というか、そもそも須賀川市に玩具店は無かったような気もする。ダイソーあたりでその手の品が売ってないかな。今度行ったときに探してみようか。
上から紐で吊るした操り人形でもあれば便利かもしれない。自作してみようかしら。…何か本筋とずれてきている気もするけど。
自分の顔を映す…のはちょっと気が引ける。玩具店でプリキュアのお面でも買ってこようか。嘘。というか、そもそも須賀川市に玩具店は無かったような気もする。ダイソーあたりでその手の品が売ってないかな。今度行ったときに探してみようか。
上から紐で吊るした操り人形でもあれば便利かもしれない。自作してみようかしら。…何か本筋とずれてきている気もするけど。
[ ツッコむ ]
以上です。