Processing で Webcam を使って遊ぶ。[応用編]

少し時間置いてしまいましたが、応用編です。

もうちょっと発展的な内容?をやるつもり?だったのだけど。

まあ、適当に進めていきますか。自分のメモ的な感じも含めて。

 

複数同時にいじくりまわす。

image479

まず、この前一つにもともとの映像を表示して、右側に白黒表示とかやったんだよね。

じゃあ、3つとか4つ表示してみようよ!!とかやってみたくなるでしょう。

実際、この画像みたいに、これぐらいやっても CPU が唸りだすぐらいで、普通に行けます。

しかしですね、これなかなか面倒なんです。

image(cap, 0, 0); 
image(mono(cap), 320, 0);

この前は、こんなことやったと思うんですが、例えばこれを

image(cap, 0, 0);
image(r_only(cap), 320, 0);
image(g_only(cap), 320 * 2, 0);
image(b_only(cap), 320 * 3, 0);
image(rg_only(cap), 320, 240);
image(gb_only(cap), 320 * 2, 240);
image(rb_only(cap), 320 * 3, 240);

とかやっても、うまくいきません。

そんなときは、

PImage tmp = new PImage(320, 240);

image(cap, 0, 0);
tmp.copy(cap, 0, 0, 320, 240, 0, 0, 320, 240);
image(r_only(tmp), 320, 0);
tmp.copy(cap, 0, 0, 320, 240, 0, 0, 320, 240);
image(g_only(tmp), 320 * 2, 0);
tmp.copy(cap, 0, 0, 320, 240, 0, 0, 320, 240);
image(b_only(tmp), 320 * 3, 0);
tmp.copy(cap, 0, 0, 320, 240, 0, 0, 320, 240);
image(rg_only(tmp), 320, 240);
tmp.copy(cap, 0, 0, 320, 240, 0, 0, 320, 240);
image(gb_only(tmp), 320 * 2, 240);
tmp.copy(cap, 0, 0, 320, 240, 0, 0, 320, 240);
image(rb_only(tmp), 320 * 3, 240);

こんなことをすることで、改善されるはず。

僕は、結構ハマりました。

ああ、やりがちなミスとして PImage.copy じゃなくても

tmp = cap;

でいいんじゃない?って思うかもしれないけど、上のやつと同じことになります。

やめましょう。

原因は、いろいろ妄想してみると、なんとなくわかるかもしれません。

 

ある色に近い色を探す

image481

image480

image483

例えばこんなこと。

上から、赤、緑、青に近い色だけを抜き出しています。

しかし、これもなかなか難しいんです。

考えてみれば、何となく想像つくかな?やってみるのが一番いい。

人間の目と、コンピュータは感覚がちょっと違いますし。

だけど、実は結構楽に実現できる式があります。

float clch(color a, color b)
{
  int rr, gg, bb;
  float cl;
  rr = (int)(red(a) - red(b));
  gg = (int)(green(a) - green(b));
  bb = (int)(blue(a) - blue(b));
  cl = sqrt(rr * rr + gg * gg + bb * bb);
  return cl;
}

これです。

color a と color b が、どれぐらい似ているかを返します。

ん?!どっかで見たことある?

yes, パソコン甲子園ですw

まあ、これでもなかなか難しい所ありますが、まあまあな感じになります。

この関数、いろんなところで応用できるので、覚えておくと便利かと。

 

image484

このことをうまく使うと、こんな感じで輪郭検出っぽいこともできます。

オートフォーカスじゃないカメラは、これ使うとピント合わせが楽になりますw

動き検出とかも、可能ですね。

 

モザイクとか

image486

画像のエフェクトといったら、やっぱりこれでしょう。

モザイクw

こんな感じでやってます。

PImage mosaic(PImage img)
{
  color c;
  int a;
  if(!dd) {
    for(int x = sx; x < ex; x += i) {
      for(int y = sy; y < ey; y += i) {
        c = img.get(x, y);
        for(int xx = 0; xx < i; xx++) {
          for(int yy = 0; yy < i; yy++) {
            c = blendColor(c, img.get(x + xx, y + yy), BLEND);
          }
        }
        for(int xx = 0; xx < i; xx++) {
          for(int yy = 0; yy < i; yy++) {
            img.set(x + xx, y + yy, c);
          }
        }
      }
    }
  }
  return img;
}

ああ、なんかちょっと変かもしれないけど。

if(!dd) とか。それは、こんな機能を実装してるため。

 

image487

ドラッグアンドドロップで、モザイクをかける範囲を指定可能だったり。

あとは、モザイクのブロックの大きさも変更可能だったりと、無駄な機能を入れてるからです。

 

ということで、応用編はここで終了ということで。

内容薄いけど、まあw

僕もまだまだ、現在進行形だし。

今やろうとしてることは、2つの Webcam、または画像と Webcam を使っていろいろと...

いつものプログラミングとはちょっと違って面白いです。

トラックバック(0)

このブログ記事を参照しているブログ一覧: Processing で Webcam を使って遊ぶ。[応用編]

このブログ記事に対するトラックバックURL: http://techno-st.net/mt/mt-tb.cgi/671

コメントする

2008年11月

      1
2345678
9101112131415
16171819202122
23242526272829
30      

Random Entries

日替わりらしい。
仕様上ページ別に変わるらしい。
Random な感じらしい。

アーカイブ

  • 月別アーカイブ:
  • カテゴリーアーカイブ:

Ads

このブログ記事について

このページは、technoが2008年10月 4日 17:05に書いたブログ記事です。

ひとつ前のブログ記事は「Processing で Webcam を使って遊ぶ。[基本編]」です。

次のブログ記事は「Windows Live Messenger 9 Beta と Pidgin」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

 

- 実験中 -

mgfxjey49@techno-st.net

xq58grpua@techno-st.net

m0ss9eatc(at)techno-st.net

y75vdonfa@techno-st.net

edvvb6cx9@techno-st.net

Mail Address