Bonjour je continue a explorer processing et le traitement de la vidéo.
La j'en suis a essayer de créer un effet miroir ( l'image se reflète en son milieu ).
Donc avant d'y arriver, ce qui me demandera de griller un certain nombre de mes neuronnes, je voudrais simplement mettre la moitié de mon image en noir.
Pour ce fait j'ai composé ce petit script :
int m; import processing.video.*; Capture myCapture; void setup() { size(640, 480); String s = "Sony HD Eye for PS3 (SLEH 00201)"; myCapture = new Capture(this, width, height); // Set the frameRate to read 4 new images per second // myCapture.frameRate(30); } void draw() { if(myCapture.available()) { myCapture.read(); } loadPixels(); m=mouseY*width+mouseX; for (int j = 0; j<height;j++){ for (int i = 0; i<width;i++){ if(i>width/2){ pixels[j*width+i]=color(0,0,0); } } } myCapture.updatePixels(); println("rouge :"+ red(pixels[m]) + "vert :"+green(pixels[m])+"bleu :"+blue(pixels[m])); image(myCapture, 0, 0); }
Quand je survole l'image avec ma souris, mon println m'affiche bien des valeurs 0 0 0 pour la moitié droite de mon image, mais pour ce qui est de mon image, elle est pleine, la partie droite affiche ce que voit ma caméra...
J'ai essayé avec un simple updatePixels(); , mais même effet.
Alors si quelqu'un a une piste, je prends
Merci de m'avoir lu
Hors ligne
Résolu, toute référence au traitement des pixels doit être précédé de l'objet myCapture :
int m; import processing.video.*; Capture myCapture; void setup() { size(640, 480); String s = "Sony HD Eye for PS3 (SLEH 00201)"; myCapture = new Capture(this, width, height); // Set the frameRate to read 4 new images per second // myCapture.frameRate(30); } void draw() { if(myCapture.available()) { myCapture.read(); } myCapture.loadPixels(); m=mouseY*width+mouseX; for (int j = 0; j<height;j++){ for (int i = 0; i<width;i++){ if(i>width/2){ myCapture.pixels[j*width+i]=color(0,0,0); } } } myCapture.updatePixels(); println("rouge :"+ red(myCapture.pixels[m]) + "vert :"+green(myCapture.pixels[m])+"bleu :"+blue(myCapture.pixels[m])); image(myCapture, 0, 0); }
Hors ligne
"Résolu, toute référence au traitement des pixels doit être précédé de l'objet myCapture"
Salut,
Attention, c'est valable dans le cas des pixels de ton objet myCapture ...
mais, loadPixels() et updatePixels() sont des fonctions qui permettent aussi de manipuler le buffer de ta sortie processing
ainsi pour ton effet miroir (j'ai pas testé) :
loadPixels(); //chargement des pixels de la sortie myCapture.loadPixels(); // chargement des pixels de myCapture // effet miroir de myCapture vers la sortie ssi width = myCapture.width & height = myCapture.height for(int i = 0; i < width; i++){ for(int j = 0; j < height; j++){ pixels[j*width + width-1 - i] = myCapture.pixels[j*width + i]; } } updatePixels(); // maj de la sortie // normalement, pas besoin de faire un myCapture.updatePixels() puisque tu ne fais que lire ce tableau //image(myCapture, 0, 0); // ne pas mettre, tu re-updaterais ta sortie
++
Dernière modification par 22_ (2010-05-03 20:48:27)
Hors ligne
Merci, entre temps j'ai créé ce bout de code qui marche, mais je sais pas si c'est le plus optimisé..
myCapture.loadPixels(); for (int j = 0; j<height;j++){ for (int i = 0; i<width;i++){ if(i>width/2){ p=i-width/2; myCapture.pixels[j*width+i]=myCapture.pixels[j*width+width/2-p]; } } } myCapture.updatePixels();
La question que je me pose c'est en mélangeant l'image présente dans le buffer , qui est si je ne me trompe l'image précédente ou l'image t-1 et celle de la cam l'image t (actuel)
Je vais tester ton code voir ce qu'il donne car je trouve pas le mien très esthétique...
++
Hors ligne
Donc je viens de tester ton code, lors de l'affichage de l'image : image(myCapture, 0, 0);
l'effet n'est pas visible, mais en appliquant que sur le myCapture soit :
myCapture.pixels[j*width + width-1 - i] = myCapture.pixels[j*width + i];
cela fonctionne, et il suffit juste d'inverser les deux pour obtenir le miroir inverse ( soit droite-etiord, ou gauche-ehcaug ).
Merci^^
++
Hors ligne
videoactif a écrit:
Donc je viens de tester ton code, lors de l'affichage de l'image : image(myCapture, 0, 0);
l'effet n'est pas visible, mais en appliquant que sur le myCapture soit :
myCapture.pixels[j*width + width-1 - i] = myCapture.pixels[j*width + i];
cela fonctionne, et il suffit juste d'inverser les deux pour obtenir le miroir inverse ( soit droite-etiord, ou gauche-ehcaug ).
Merci^^
++
C'est pour ça que j'ai précisé dans le code de ne pas appeler la fonction image() qui est un update de pixels -
en fait faire image(myCapture, 0, 0) est équivalent à
loadPixels();
myCapture.loadPixels();
for(blabla){
for(blabla){
pixels[j*width + i] = myCapture.pixels[j*width + i];
}
}
updatePixels();
pixels[] est ce qui s'affiche dans ta sortie processing.
concernant ton code, fais attention aux effets de bords ...
myCapture.pixels[j*width+i]=myCapture.pixels[j*width+width/2-p];
tu modifies le tableau que tu lis ... normalement, tu devrais d'abord faire une copie de ton tableau, puis modifier ton tableau originel en lisant ta copie, ça peut paraître lourd mais ça t'évitera des bugs ... typiquement si tu lis un pixel déjà modifié dans ta boucle.
++
Dernière modification par 22_ (2010-05-03 22:03:20)
Hors ligne
Pages: 1