From b32909586daff58612d9ac65c915c8f8cf0616e9 Mon Sep 17 00:00:00 2001 From: David Corvoysier Date: Fri, 7 Jun 2013 15:27:59 +0200 Subject: [PATCH] Added basic skin detector filter --- src/core/canvas.js | 1 + src/filters/adjust/skin.js | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 src/filters/adjust/skin.js diff --git a/src/core/canvas.js b/src/core/canvas.js index aeb87ed..d95bfb6 100644 --- a/src/core/canvas.js +++ b/src/core/canvas.js @@ -178,6 +178,7 @@ exports.canvas = function() { canvas.vignette = wrap(vignette); canvas.vibrance = wrap(vibrance); canvas.sepia = wrap(sepia); + canvas.skin = wrap(skin); return canvas; }; diff --git a/src/filters/adjust/skin.js b/src/filters/adjust/skin.js new file mode 100644 index 0000000..53151e8 --- /dev/null +++ b/src/filters/adjust/skin.js @@ -0,0 +1,34 @@ +/** + * @filter Skin + * @description Filters-out pixels not matching skin color. + * from: + * Human skin color clustering for face detection + * J. Kovac, P. Peer, F. Solina - 2003 + */ +function skin() { + gl.skin = gl.skin || new Shader(null, '\ + uniform sampler2D texture;\ + varying vec2 texCoord;\ + void main() {\ + vec4 color = texture2D(texture, texCoord);\ + float r = color.r;\ + float g = color.g;\ + float b = color.b;\ + \ + if ((r>45.0/255.0)&&(g>40.0/255.0)&&(b>20.0/255.0)\ + &&(r>g)&&(r>b)\ + &&(r-min(g,b)>15.0/255.0)\ + &&(abs(r-g)>15.0/255.0)){\ + gl_FragColor = color;\ + } else {\ + gl_FragColor = vec4(0.0,0.0,0.0,color.a);\ + }\ + }\ + '); + + simpleShader.call(this, gl.skin, { + amount: clamp(0, 1) + }); + + return this; +}