2011年05月24日

Processing+webCameraで画像処理

"Processing で Webcam を使って遊ぶ。[応用編] - trial and error"
http://techno-st.net/2008/10/04/processing-webcam-2.html

上記のサイトを参考に,色々あそびました.

Processing + WebCamで遊んでるところ
http://in.shappi.org/article/200705795.html

以前の続き.

今回は参考にさせてもらったサイトをもとに,作成したソースコードを貼りつけます.
■マウスでクリックした部分の色を抽出する


cliping.PNG


上記のような感じになります.よりはっきりした結果になるようにイメージをモノクロ変換してからの抽出も試しています.


// ////////////////////////////////////////////////////////////////////////
// クリックした部分の色で抜き出す.
import processing.video.*;

Capture cap;
boolean DoDraw = false;
float Size;

void setup()
{
size(320 * 2, 240);
background(0);
cap = new Capture(this, 320, 240);
frameRate(10);
}


void draw()
{
if(cap.available()) {

cap.read();
image(cap, 0, 0);
}
if(DoDraw){
drawOtherDisplay(cap);
DoDraw = false;
}
}

void drawOtherDisplay(PImage img)
{
color c;
PImage i_tmp = new PImage(320, 240);
c = img.get(mouseX, mouseY);
for(int x = 0; x < 320; x++){
for(int y = 0; y < 240; y++) {
i_tmp.set(x, y, c);
}
}
//image(i_tmp, 320, 0);
drawDispwithColor(img, c);
}

void drawDispwithColor(PImage img, color c)
{
color c_src;
float ckpx = 0;
PImage i_tmp = new PImage(320, 240);

// // color -> mono
//img = mono(img);
for(int x = 0; x < 320; x++){
for(int y = 0; y < 240; y++) {
c_src = img.get(x, y);
ckpx = clch( c_src, c);
if( ckpx < 30 ){
i_tmp.set(x, y, 0);
}else{
i_tmp.set(x, y, color(255, 255, 255));
}
}
}
image(i_tmp, 320, 0);
}

PImage mono(PImage img)
{
color c;
int a;
for(int x = 0; x < 320; x++){
for(int y = 0; y < 240; y++) {
c = img.get(x, y);
a = (int)(red(c) + green(c) + blue(c)) /3;
img.set(x, y, color(a));
}
}
return img;
}

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;
}

void mousePressed()
{
if(mouseButton == LEFT) {
DoDraw = true;
}else {
// nothing.
}
}




■様々な単色カラーで表示.

左下二つが真っ黒なのは単にスペースが出来てしまっただけです.
もともと,右長につくっていたのですが縦長のほうがWebに載せるにはよいので変更しました.
グレースケールの正確性を検証するために異なる変換方法を試しています.
モノクロ化の処理は知らなかったので勉強になりました.


multicolor.PNG


ソースコードはこちら.

////////////////////////////////////////////////////////////////////////
// multi Color Sample.
import processing.video.*;

Capture cap;

void setup()
{
size(320 * 3, 240 * 4);
background(0);
cap = new Capture(this, 320, 240);
frameRate(10);
}


void draw()
{
if(cap.available()) {
cap.read();
image(cap, 0, 0);
PImage i_tmp = new PImage(320, 240);
i_tmp.copy( cap, 0, 0, 320, 240, 0, 0, 320, 240);
image(mono_super(i_tmp), 320, 0);
i_tmp.copy( cap, 0, 0, 320, 240, 0, 0, 320, 240);
image(mono_easy(i_tmp), 320 * 2, 0);
i_tmp.copy( cap, 0, 0, 320, 240, 0, 0, 320, 240);
image(mono(i_tmp), 0, 240);
i_tmp.copy( cap, 0, 0, 320, 240, 0, 0, 320, 240);
image(r_only(i_tmp), 320, 240);
i_tmp.copy( cap, 0, 0, 320, 240, 0, 0, 320, 240);
image(g_only(i_tmp),320 * 2, 240);
i_tmp.copy( cap, 0, 0, 320, 240, 0, 0, 320, 240);
image(b_only(i_tmp), 0, 240 * 2);
i_tmp.copy( cap, 0, 0, 320, 240, 0, 0, 320, 240);
image(rg_only(i_tmp), 320, 240 * 2);
i_tmp.copy( cap, 0, 0, 320, 240, 0, 0, 320, 240);
image(gb_only(i_tmp), 320 * 2, 240 * 2);
i_tmp.copy( cap, 0, 0, 320, 240, 0, 0, 320, 240);
image(rb_only(i_tmp), 320 * 2, 240 * 3);
}
}

PImage mono(PImage img)
{
color c;
int a;
for(int x = 0; x < 320; x++){
for(int y = 0; y < 240; y++) {
c = img.get(x, y);
a = (int)(red(c) + green(c) + blue(c)) /3;
img.set(x, y, color(a));
}
}
return img;
}


PImage mono_easy(PImage img)
{
color c;
int a;
for(int x = 0; x < 320; x++){
for(int y = 0; y < 240; y++) {
c = img.get(x, y);
a = (int)(2 * red(c) + 4 * green(c) + blue(c)) /7;
img.set(x, y, color(a));
}
}
return img;
}


// from CCIR Rec.601.
// http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html
PImage mono_super(PImage img)
{
color c;
int a;
for(int x = 0; x < 320; x++){
for(int y = 0; y < 240; y++) {
c = img.get(x, y);
a = (int)( 0.298912 * red(c) + 0.586611 * green(c) + 0.114478 * blue(c));
img.set(x, y, color(a));
}
}
return img;
}


PImage r_only(PImage img)
{
color c;

for(int x = 0; x < 320; x++){
for(int y = 0; y < 240; y++) {
c = img.get(x, y);
c = color(red(c), 0, 0);
img.set(x, y, c);
}
}
return img;
}


PImage g_only(PImage img)
{
color c;

for(int x = 0; x < 320; x++){
for(int y = 0; y < 240; y++) {
c = img.get(x, y);
c = color(0, green(c), 0);
img.set(x, y, c);
}
}
return img;
}


PImage b_only(PImage img)
{
color c;

for(int x = 0; x < 320; x++){
for(int y = 0; y < 240; y++) {
c = img.get(x, y);
c = color(0, 0, blue(c));
img.set(x, y, c);
}
}
return img;
}


PImage rg_only(PImage img)
{
color c;

for(int x = 0; x < 320; x++){
for(int y = 0; y < 240; y++) {
c = img.get(x, y);
c = color(red(c), green(c), 0);
img.set(x, y, c);
}
}
return img;
}
PImage gb_only(PImage img)
{
color c;

for(int x = 0; x < 320; x++){
for(int y = 0; y < 240; y++) {
c = img.get(x, y);
c = color(0, green(c), blue(c));
img.set(x, y, c);
}
}
return img;
}
PImage rb_only(PImage img)
{
color c;

for(int x = 0; x < 320; x++){
for(int y = 0; y < 240; y++) {
c = img.get(x, y);
c = color(red(c), 0, blue(c));
img.set(x, y, c);
}
}
return img;
}


posted by maplewine at 21:00| Comment(0) | TrackBack(0) | Computer | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック