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機にインストール済み。
◎ ぬいぐるみの類が欲しいかもしれない。 :
カメラの被写体として適切なモノが部屋の中に見当たらず。ぬいぐるみでもあれば便利なんだろうけど。
自分の顔を映す…のはちょっと気が引ける。玩具店でプリキュアのお面でも買ってこようか。嘘。というか、そもそも須賀川市に玩具店は無かったような気もする。ダイソーあたりでその手の品が売ってないかな。今度行ったときに探してみようか。
上から紐で吊るした操り人形でもあれば便利かもしれない。自作してみようかしら。…何か本筋とずれてきている気もするけど。
自分の顔を映す…のはちょっと気が引ける。玩具店でプリキュアのお面でも買ってこようか。嘘。というか、そもそも須賀川市に玩具店は無かったような気もする。ダイソーあたりでその手の品が売ってないかな。今度行ったときに探してみようか。
上から紐で吊るした操り人形でもあれば便利かもしれない。自作してみようかしら。…何か本筋とずれてきている気もするけど。
[ ツッコむ ]
以上です。