少し時間置いてしまいましたが、応用編です。
もうちょっと発展的な内容?をやるつもり?だったのだけど。
まあ、適当に進めていきますか。自分のメモ的な感じも含めて。
複数同時にいじくりまわす。
まず、この前一つにもともとの映像を表示して、右側に白黒表示とかやったんだよね。
じゃあ、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;
でいいんじゃない?って思うかもしれないけど、上のやつと同じことになります。
やめましょう。
原因は、いろいろ妄想してみると、なんとなくわかるかもしれません。
ある色に近い色を探す
例えばこんなこと。
上から、赤、緑、青に近い色だけを抜き出しています。
しかし、これもなかなか難しいんです。
考えてみれば、何となく想像つくかな?やってみるのが一番いい。
人間の目と、コンピュータは感覚がちょっと違いますし。
だけど、実は結構楽に実現できる式があります。
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
まあ、これでもなかなか難しい所ありますが、まあまあな感じになります。
この関数、いろんなところで応用できるので、覚えておくと便利かと。
このことをうまく使うと、こんな感じで輪郭検出っぽいこともできます。
オートフォーカスじゃないカメラは、これ使うとピント合わせが楽になりますw
動き検出とかも、可能ですね。
モザイクとか
画像のエフェクトといったら、やっぱりこれでしょう。
モザイク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) とか。それは、こんな機能を実装してるため。
ドラッグアンドドロップで、モザイクをかける範囲を指定可能だったり。
あとは、モザイクのブロックの大きさも変更可能だったりと、無駄な機能を入れてるからです。
ということで、応用編はここで終了ということで。
内容薄いけど、まあw
僕もまだまだ、現在進行形だし。
今やろうとしてることは、2つの Webcam、または画像と Webcam を使っていろいろと...
いつものプログラミングとはちょっと違って面白いです。

コメントする