Calculer le taux d’une couleur primaire (R, V ou B) présents dans des images issues d’un flux vidéo.

Ça consiste à faire une moyenne de la somme de la valeur de R de V ou de B pour tout pixel de l’image. Allez pour la frime (et parce que c’est stylé), ci-dessous un algorithme qui, accompagné d’un dispositif spécifique, de savoir si un verre de vin (rouge) est plein ou pas:

tauxrouge

mondessin-11

Concrètement, ça se traduit par :

import processing.video.*;
Capture cam;

void setup() {
size(640, 420, P2D);
cam = new Capture(this);
cam.start();
}

void draw() {
if (cam.available()) {
cam.read();
cam.loadPixels();
float stockRouge = 0;
for (int i = 0; i < cam.pixels.length; i++) {
color brut = cam.pixels[i];
//On récupère la valeurs des pixels sur les canaux RVB
int r = (brut >> 16) & 0xFF;
int v = (brut >> 8) & 0xFF;
int b = brut & 0xFF;

stockRouge += r;
}
cam.updatePixels();
stockRouge = stockRouge/(cam.width * cam.height);
println(stockRouge);
}
image(cam, 0, 0);
}

 

Incrustation (sur du vert par exemple)

On pourrait faire le calcul dans Processing, c’est facile, mais ça peut être gourmand en ressources. Je propose une solution qui combine Processing + le GLSL (le langage des shaders).

En savoir plus sur les shaders.
http://thebookofshaders.com/
https://processing.org/tutorials/pshader/

Côté Processing:

import processing.video.*;
Capture cam;
PShader traitement;

void setup() {
  size(640, 420, P2D);
  cam = new Capture(this);
  cam.start();
  traitement = loadShader("traitement.glsl");
}

void draw() {
  background(0);
  traitement.set("ptdr", map(mouseX, 0, width, 0., 1.));
  if (cam.available()) {
    cam.read();
    shader(traitement);
  }
  image(cam, 0, 0);
}

Côté GLSL (fichier .glsl à placer dans « data » du projet Processing).

#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif

#define PROCESSING_TEXTURE_SHADER

varying vec4 vertTexCoord;
uniform sampler2D texture;
uniform float ptdr;

void main() {
	vec3 texColor = texture2D(texture, vertTexCoord.st).rgb;
    
    if(texColor.r < 0.9 && (texColor.g >= ptdr && texColor.b < 0.9))
        discard;

  	//gl_FragColor = vec4(vec3(lol) * brightness, 1.0);
    gl_FragColor = vec4(texColor, 1.0);
}