jojolaglaise — 2015-07-04 11:42:44

Bonjour :-)
J'ai un petit problème concernant l'utilisation de pixels[] sur un flux d'images vidéo dans Processing.

Par exemple, lorsque j'utilise pixels[] pour changer les couleurs des pixels de ma capture vidéo, Processing semble avoir du mal à suivre la cadence et n'applique pas l'effet voulu sur toutes les images et leur totalité de manière homogène; je ne sais pas si cela est du à la puissance de mon ordi (je ne pense pas car j'ai le souvenir d'avoir déjà réussi à utiliser pixels[] dans ce cadre sans problèmes…) à moins que mon code soit trop peu optimisé (je penche pour ça). À noter quand même que mon ordinateur n'est plus tout jeune…

Voici un exemple:

import processing.video.*;

Capture cam;

void setup() {
  size(640, 480);
  cam = new Capture(this, width, height);
  cam.start();
}

void captureEvent(Capture cam) {
  cam.read();
}

void draw() {
  cam.loadPixels();
  for(int i = 0; i < cam.width * cam.height; i++){
    if(brightness(cam.pixels[i]) < 180){
      cam.pixels[i] = color(0);
    }
    else{
      cam.pixels[i] = color(255, 255, 0);
    }
  }
  image(cam, 0, 0);
}

Quelle est l'astuce pour contourner ce problème?
Merci d'avance :-)

Mushussu — 2015-07-04 12:49:21

Bonjour,

Cela n'a rien à voir avec la puissance de ton ordinateur. Il y a une confusion avec variable locale et variable globale.
cam dans la méthode captureEvent() est une variable locale différente de ta variable globale cam. Il faut faire attention à ne pas utiliser des variables de même nom pour éviter les confusions.
Voici le code fonctionnel :

import processing.video.*;

Capture cam;

void setup() {
  size(640, 480);
  cam = new Capture(this, width, height);
  cam.start();
}

void draw() {
  if (cam.available()) {
    cam.read();
    cam.loadPixels();
    for (int i = 0; i < cam.width * cam.height; i++) {
      if (brightness(cam.pixels[i]) < 180) {
        cam.pixels[i] = color(0);
      } else {
        cam.pixels[i] = color(255, 255, 0);
      }
    }
    cam.updatePixels();
  }
  image(cam, 0, 0);
}

Si tu souhaites malgré tout utiliser les interruptions :

import processing.video.*;

Capture cam;
PImage imago;

void setup() {
  size(640, 480);
  cam = new Capture(this, width, height);
  cam.start();
  imago = createImage(width, height, RGB);
}

void captureEvent(Capture cam) {
  cam.read();
  cam.loadPixels();
  for (int i = 0; i < cam.width * cam.height; i++) {
    if (brightness(cam.pixels[i]) < 180) {
      imago.pixels[i] = color(0);
    } else {
      imago.pixels[i] = color(255, 255, 0);
    }
  }
  imago.updatePixels();
}

void draw() {
  image(imago, 0, 0);
}
jojolaglaise — 2015-07-04 13:51:17

Oh! Mille merci! :) Effectivement, je vois mon erreur… Je me être trompé-je misérablement!
Une bonne journée!