Zab — 2012-12-11 06:05:46 |
Bonjour à tous
Je débute en pure data, et je cherche à appliquer une transformation (homothétie) à une vidéo issue d'une webcam. J'ai trouvé comment utiliser la webcam et utiliser ses frames pour du traitement d'image. En revanche je ne trouve pas d'outil qui me semble adapté pour changer les valeurs (R G B) d'un pixel en position (i, j). Il y a bien les objets pix_set ou pix_dump, mais (si j'ai bien compris la doc), ils ne permettent pas de choisir précisement la position du pixel à modifier...
Quelqu'un aurait une idée?
|
Zab — 2012-12-11 08:30:16 |
homographie, pas homothétie... (désolée)
|
pob — 2012-12-11 10:46:47 |
Bienvenue,
[pix_data] va te permettre de lire les valeurs d'un pixel en particulier. Pour écrire, comme objet tout fait, je ne vois pas.
Il y a sans doute un truc à faire avec des shaders, c'est une autre programmation qui va être encapsulée dans ton patch et qui, sur un ordi avec une vraie carte graphique sera bien plus performant. Il y a un sujet assez long avec pas mal d'infos à trier sur la même rubrique du forum.
Une autre façon de faire serait d'utiliser gridflow. http://artengine.ca/gridflow/
|
Zab — 2012-12-11 12:17:19 |
Merci pour ta réponse rapide! Je viens d'installer Gridflow, je vais voir ce que je peux faire avec. Tu sais s'il y a une doc quelque part? Je ne l'ai pas trouvé sur le lien que tu m'as passé.
|
pob — 2012-12-11 12:25:20 |
C'est assez complet dans les fichiers d'aide. Il y a notamment un patch nommé "index.pd" dans "extra/gridflow/doc/" qui fait l'inventaire des différentes fonctions et autres trucs concernant gridlfow.
S'il y a de gros traitements à faire, ce n'est pas la solution idéale. Pour Windows il y a des limitations assez importantes. Ca dépend un peu de ce que tu veux faire en pratique...
|
Zab — 2012-12-11 12:32:49 |
En fait, j'ai une matrice d'homographie que j'aimerais appliquer a une image. Normalement je fais ça en appliquant ma transformation a chaque coordonnée de pixel (produit matriciel), mais je n'ai pas encore trouvé comment récupérer les coordonnées d'un pixel, les multiplier, puis replacer mon pixel sur l'image. Je ne sais pas si c'est considéré comme un 'gros traitement'? Je vais regarder le patch d'index. Merci encore.
|
pob — 2012-12-11 12:43:46 |
[pix_multiply] si tu as ta matrice de traitement déjà sous forme d'image aux même dimensions que celle de ta webcam. Là aussi c'est lourd en calcul pour un truc nettement plus efficace avec les shaders.
En fait la question essentielle, c'est d'où sortent tes coefficients (image statique ou flux d'image) ou suite de valeurs calculées tirées d'une autre flux de données. Ca ne sert à rien de faire des conversions inutiles.
|
Zab — 2012-12-11 13:00:22 |
En fait, ma matrice d'homographie H est une matrice 3x3 que je calcule une fois pour toute avec un autre programme (matlab). Pour appliquer mon homographie a une image dans puredata, j'ai besoin de changer la place de chacun des pixels de mon image pour leur attribuer leur nouvelle place après application de l'homographie. En gros, pour chaque pixel (i,j) de mon image, l'opération a effectuer est:
[i] [ h1 h2 h3] [i'] [j] x [ h4 h5 h6] = [j'] [1] [ h7 h8 h9] [1]
Ca se voit peut-être pas, mais ce sont des vecteurs et une matrice. Je dois donc calculer les nouvelles coordonnées (i', j') de mon pixel, et écrire la valeur de ce pixel à ces coordonnées (i', j') dans ma nouvelle image.
J'espère que j'arrive à être claire...
|
pob — 2012-12-11 13:19:53 |
OK, tu fais un produit matriciel sur les coordonnées et non pas sur les couleurs.
Franchement, regarde les shaders, ça ne fera qu'une bouchée des calculs. C'est fait pour faire du calcul matriciel en vidéo. http://codelab.fr/2897
|
nononononono — 2012-12-11 14:43:25 |
Yop,
Ca marche aussi très bien avec gridflow, c'est fait aussi pour ça...Les exemples sont un peu compliqués, mais prends waves par ex.
Ceci étant, pour les shaders, à ma connaissance en tout cas, on ne peut pas faire passer de matrice en arguments uniform. l'astuce étant qu'une matrice de 3 par 3 peut être interprétée comme un tableau de 3 vec3. NB : pour ce genre de calcul, mieux vaux utiliser texture2DRect et connaitre la taille de l'image. Donc [rectangle 1< sur ton objet texture.
Question : à quoi correspond ton [1]?
|
Zab — 2012-12-11 19:36:15 |
Salut,
Le [1] dans les vecteurs de coordonnées correspond à la coordonnée homogène, en gros juste une variable supplémentaire qui me permet d'utiliser d'appliquer des matrices 3x3 à des vecteurs normalement 2x2. Elle est liée aux deux autres, ainsi le système a bien 2 degrés de liberté, et non 3.
Au passage, je me suis plantée dans mon produit matriciel dans le message plus haut, c'est plutot:
[ h1 h2 h3] [i] [i'] [ h4 h5 h6] x [j] = [j'] [ h7 h8 h9] [1] [1]
Pour l'instant je suis un peu perdue dans Gridflow, mais je vais étudier waves de plus près. J'aimerais éviter les shaders, OpenGl n'est pas installé sur mon PC.
Merci beaucoup pour vous réponses en tout cas!
|
Olivier — 2012-12-13 00:46:35 |
citation :OpenGl n'est pas installé sur mon PC.
Si ta carte graphique supporte l'OpenGL, je ne crois pas que tu aies besoins de l'installer... Saches par ailleurs que GEM fonctionne en OpenGL, donc il vaudrait mieux, shader ou pas, que ta carte graphique gère cela...
Sinon, ce que tu essayes d'obtenir me semble assez accessible avec Processing... Es-tu obligé d'utiliser Pd ?
|
oli44 — 2012-12-13 13:12:29 |
Par rapport à openGL, tu veux dire que ta carte graphique ne le gère pas ou que tu n'as pas les drivers permettant d'en tirer parti?
Concernant le fond du problème, es-tu allé voir du côté d'iemmatrix? il y a énormément d'objets pour le calcul matriciel (sans devoir passer par une install de Gridflow, c'est dans pd-extended).
Olivier: c'est autant accessible avec Pd que Processing ce genre de pb!!!
|
nononononono — 2012-12-13 21:13:31 |
Mhh, je suis d'avis avec olivier sur processing du coup, car si pc ( donc windows je suppose) alors pb compatibilité GEM->Gridflow (conversion pix->matrice). Le travail avec iemmatrix, oui, mais comment faire passer les pixels dans un tableau 3d ( pix-dump? pix-data? ça sent la bidouille) en fait pure data a des pointeurs pour les nombres les caractères, les listes, les tableaux à 1 dim, mais pas au delà, du moins pas nativement (ce que fait chacun à sa manière gridflow, iemmatrix, et les pix-obj et les pdp, mais pas du tout harmonisés entre eux, c'est pour ça qu'il y a des pix2pdp, #to-pix etc...mais j'ai pas vu de pix2iem par exemple). Zab, teste dans les exemples Gem simple_texture.pd , on sait jamais si ça marche c'est que tout est installé (je parle d'openGL+glsl)... Sinon je rejoins l'avis Olivier, à savoir passer sous linux (pour compatibilité gridflow) ou essayer sous processing qui est pour le coup vraiment adapté (et relativement simple) pour faire du travail matriciel.
|
Olm-e — 2012-12-14 11:03:07 |
hello, je suis justement en train de travailler sur un problème similaire, à savoir refaire un "wiiwhiteboard" avec pd, donc je cherche à faire une homographie entre le plan déterminé par les points de repère et une surface dans GEM,
personellement je ne suis pas parti sur le transformation de chaque pixel mais plutôt sur celle d'un plan texturé (on modifie les coins du quadrilatère ) est-ce que ce n'est pas une manière plus simple de faire ce calcul ?
pour calculer l'homographie j'ai du faire une bidouille en python, parce que je ne suis pas arrivé à obtenir les bonnes transformations de matrice avec iemmatrix ... problèmes de dimention de matrice et d'ordres des opérations que je n'arrive pas à résoudre.
|
nononononono — 2012-12-14 11:39:40 |
Salut olm-e, je ne pense pas qu'on parle d'application projective dans ce cas là mais si c'est le cas en effet c'est plus simple de faire comme tu le dis ( et on peux choisir bien plus facilement son medium pour le coup )
|
Olm-e — 2012-12-14 16:14:53 |
pour info, le code que j'utilise pour calculer la matrice d'homographie en python (tiré de http://eclecti.cc/computergraphics/easy … -in-python ) :
si quelqu'un peut me refaire ça en iemmatrix ça me botte ;)
|
Olivier — 2012-12-15 12:53:27 |
Olm-e, je ne sais pas si c'est ce que tu cherches à faire, mais il y a ce post qui pourrait peut-être t'intéresser...
http://codelab.fr/1619#p12222
Bon courage... :)
|
Olm-e — 2012-12-19 09:46:52 |
@Olivier : merci, je connaissais la technique(exelente d'ailleurs) depuis notement que j'aie aidé le projet Larsen3G aux Nuits Blanches à Bxl en 2011. Cce que je cherche à faire est en fait l'inverse : à partir des coins d'un quadrilatere aux dim. connues trouver la transformation géométrique pour redresser l'image à l'écran...
|
Zab — 2012-12-20 22:43:12 |
Je n'avais pas vu que la discussion s'était poursuivie sur ce forum, désolée de ne pas avoir répondu du coup...
Pour OpenGL non installé sur mon PC, c'est un message d'erreur que j'ai eu dans la console puredata lorsque j'ai essayé de faire marcher certains patchs de Gridflow. Les shaders notamment ne fonctionnent pas. On m'avait déjà recommandé Processing, le problème est que l'homographie fait partie d'un projet qui est tout en puredata, donc a moins de renvoyer mon image dans puredata une fois transformée, ça ne m'avance pas trop.
Sinon, j'ai testé le patch cité deux messages plus haut, ben c'est exactement ce que je voudrais faire (sauf que la transformation que je veux appliquer a ma vidéo est fixée une fois pour toute). Du coup je vais essayer de décortiquer ce patch, merci beaucoup Olivier!
|