Hello !
Je suis en train de développer un projet où un dessin s'exécute en fonction de tel et tel paramètre.
Seulement j'aurais aimer connaitre la dominance de couleur pour qu'à une certaine saturation de l'espace dessiné (sur fond blanc) le dessin s'enregistre et reprend à zéro.
J'ai regardé du coté de la méthode get() et des pixels, or il est impossible que cela marche étant donné qu'il ne s'agit pas d'une image chargé dans Processing mais d'un dessin de programmation…
Je solicite alors votre aide !
Merci d'avance chers Processors ( comme disent les anglophones de cette communauté )
Hors ligne
Salut JeremyVey,
Bienvenu sur le forum.
Concernant ta question, tu peux utiliser get() avec autre chose qu'une image importée.
get() opère sur le pixel en court, ce peux être un pixel extrait d'une image, d'une vidéo, d'une photo...
Voici un petit bout de code qui pourrait t'aider à y voir plus clair:
void setup() { for(int i=0; i<width; i++) { for(int j=0; j<height; j++) { color c = color(random(255), random(255), 0); stroke(c); point(i, j); } } } void draw() { color catchColor = get(mouseX, mouseY); float r = red(catchColor); float g = green(catchColor); float b = blue(catchColor); println(r+" "+g+" "+b); }
+++
Hors ligne
MODIF
Je croyais avoir trouver un début de solution en définissant une zone de lecture dans le get (x,y,width,height).
Seulement il me met ce message d'erreur : cannot convert from PImage to int.
Que dois-je comprendre ? Est-ce que ce n'est pas possible à moins qu'il s'agisse d'une image ?
Merci d'avance pour la réponse
——
Merci pour le message de bienvenue et pour le petit code
En effet, cela m'éclaire un peu car je croyais que ce n'était que réservé à une image.
Seulement voilà moi je ce que je souhaite c'est que le get() lise toute la surface du sketch, et pas qu'un seul pixel, pour que je puisse récupérer une dominante de couleur.
Par exemple mon programme dessine en bleu sur fond blanc.
Au bout d'un certain temps le bleu du dessin envahit le fond blanc.
Il faut alors que je dise au programme : lorsqu'il ne me reste plus que 10% de blanc j'enregistre mon dessin, je nettoie le sketch et je relance le dessin.
Peut-être que je me trompe de méthode pour y parvenir mais je ne vois pas d'autres astuces que celui de la couleur…
En tout cas merci pour cette réponse claire et rapide !
Dernière modification par jeremyvey (2011-03-14 12:57:33)
Hors ligne
Salut,
comme le dit oyster_ la méthode get(x,y) - pas get(x,y,width, height) - te renvoie la couleur d'un pixel de ta sortie, sous forme d'un objet color.
Peu importe que tu manipules une image ou pas.
Tu peux aussi utiliser le tableau pixels[], c'est un peu plus pénible mais plus rapide.
Hors ligne
Bonjour,
jeremyvey a écrit:
Seulement voilà moi je ce que je souhaite c'est que le get() lise toute la surface du sketch, et pas qu'un seul pixel, pour que je puisse récupérer une dominante de couleur.
Avec une double boucle tu peux parcourir l'ensemble des pixels et remplir tes variables. La double boucle est dans le setup() du code qu'Oyster t'as donné plus haut
jeremyvey a écrit:
Par exemple mon programme dessine en bleu sur fond blanc.
Au bout d'un certain temps le bleu du dessin envahit le fond blanc.
Il faut alors que je dise au programme : lorsqu'il ne me reste plus que 10% de blanc j'enregistre mon dessin, je nettoie le sketch et je relance le dessin.
Pour faire ça, tu peux utiliser plusieurs passages de la boucle draw() pour construire ton dessin au fur et à mesure, afin de tester à chaque fois la valeur de "remplissage". Voila un code qui additionne les valeurs de luminosité à partir du tableau de pixels, et qui remets l'image à zéro quand une certaine valeur est dépassée :
Hors ligne
OUPS ! Désolé pour l'absence…
Merci pour ces pistes de solutions, je vais explorer tout ça et vous tenir au courant.
Pour la méthode de brightness() c'est pas mal, je vais voir comment je peux bidouiller tout ceci pour l'incorporer dans mon code.
Encore merci et je ne manquerais pas de signaler dans le post si cela fonctionne !
Hors ligne
Bon…
Je dois pas être doué pour détourner les codes.
En vérité je crois que mon sketch est trop grand pour que ça marche (entre 800*600 et 1440*900 pixels), du coup j'obtiens des valeurs de folies et il existe même un plafond pour ces valeurs !
Je me suis débrouillé pour calculer combien de temps en moyenne le sketch arrive à saturation pour le nettoyer toute les X minutes…
En tout cas merci pour votre aide et à bientôt !
Hors ligne
Salut JeremyVey,
Tu peux travailler avec processing sur des sketch de 30000*30000 si tu veux ou plus. Le risque de plantage dépendra des capacités de ton CPU à encaisser la somme de calcul (et ta carte graphique si tu utilise OpenGL).
N'hésites pas à poster ton code qui te pose problème, ça nous permettra peut être de t'aider.
NB : les variables de type int sont limitées en contenance, si tu a besoin de très grand chiffres tu peux utiliser des long:
citation :
For int, from -2147483648 to 2147483647, inclusive
For long, from -9223372036854775808 to 9223372036854775807, inclusive
+++
Hors ligne
heu...
il me semble qu'il ya un outil mathématique très puissant, ...mais néanmoins un peu compliqué à utiliser :
c'est la MOYENNE :
Avec ceci, la valeur de la mesure n'est pas affectée par la taille de ta fenêtre
Dernière modification par cdriko (2011-03-21 22:02:21)
Hors ligne
Hello,
Il n'y a pas vraiment de problème avec l'exemple puisque les valeurs de couleurs sont normalisées entre 0 et 1 (par colorMode(RGB, 1); dans le setup), au maximum somme vaudra donc width * height, c'est à dire 160 000 dans l'exemple ou 900 000 000 avec une image de 30 000 x 30 000
C'est en utilisant des valeurs sur 255 que ça peut exploser le plafond des "int".
Enfin, il y a une solution très simple aussi, sans même utiliser de moyenne, c'est de réduire la valeur, en la divisant par 1000 par exemple avant de l'ajouter à somme.
Hors ligne
Super merci pour ces précisions !!!!
Je suis désolé pour tout ce temps d'absence mais ce projet est passé, j'ai fini par opter pour la solution de temporisation du sketch qui toutes les X minutes se rafraichit…
Autrement je pense qu'en effet c'est une problème de contenance du « int ».
Je vais essayer avec « long » (je ne savais pas que cela existait…).
Encore un grand merci pour toute cette aide !
Je vais poster une nouvelle question pour Processing, j'espère que vous saurez me répondre aussi avec autant de générosité et d'entrain
À bientôt !
Hors ligne
Pages: 1