http://techno-st.net/2008/10/04/processing-webcam-2.html
上記のサイトを参考に,色々あそびました.
Processing + WebCamで遊んでるところ
http://in.shappi.org/article/200705795.html
以前の続き.
今回は参考にさせてもらったサイトをもとに,作成したソースコードを貼りつけます.
■マウスでクリックした部分の色を抽出する
上記のような感じになります.よりはっきりした結果になるようにイメージをモノクロ変換してからの抽出も試しています.
// ////////////////////////////////////////////////////////////////////////
// クリックした部分の色で抜き出す.
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に載せるにはよいので変更しました.
グレースケールの正確性を検証するために異なる変換方法を試しています.
モノクロ化の処理は知らなかったので勉強になりました.
ソースコードはこちら.
////////////////////////////////////////////////////////////////////////
// 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;
}