Deformation d'image

Mandrakke Messages postés 4 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 30 mars 2007 - 29 mars 2007 à 11:34
Mandrakke Messages postés 4 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 30 mars 2007 - 29 mars 2007 à 15:02
Bonjour à tous

Voila, je vous propose un sujet pas très banal:
Pour mon projet de fin d'etude, je dois projeter des images sur un demi-cylindre par l'exterieur de celui-ci. Vous comprendrez facilement que les images qui seront projetées ( à l'aide d'un videoprojecteur) doivent etre déformées pour apparaitre en taille réelle (et non déformées) sur l'ecran.
La ou ça se complique, c'est que je ne dois pas me contenter d'afficher des images, mais surtout de pouvoir projeter sur le cylindre toutes les applications utilisées sous windows (pour faire un poste de travail) ainsi que le bureau windows.

Ne trouvant pas de solution très simple à ce probleme, je vais essayer de tricher:
J'aimerai recuperer les images de sortie de mes applications que je fais fonctionner sous windows, et plaquer ces images sur un cylindre aux bonnes dimensions sous opengl. Il ne me reste plus alors qu'à filmer ce cylindre sous opengl et projeter ce resultat sur mon cylindre-ecran réel. De cette facon, les images sur mon cylindre-ecran ne m'apparaitront plus déformées...

Je commence à me débrouiller en c++ et opengl, mais mes connaissances restent très limitées.

Avis aux amateurs....je n'ai aucune idée pour programmer cela

Merci à tous ceux qui se pencheront sur le sujet!!!

4 réponses

acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
29 mars 2007 à 12:56
salut:
j'ai une proposition!!

je suppose que ton demi cylindre est convexe et vertical :

donc pas besoin de déformer l'image en y, par contre :
une distance horizontale x au milieu de l'image apparaitra toujours x sur le milieu de ton demi cylindre,
mais la même distance x sur le côté de l'image apparaitra très grande sur le côté de ton demi cylindre, donc il faut que plus tu es sur le côté de l'image
(qui sera projetée sur le côté du cylindre) plus tu diminues cette distance x entre 2 points...

ensuite tu fais un petit dessin d'une projection d'un segment horizontal sur un demi cercle (dont le diamètre est horizontal aussi) et tu obtiens en considérant une image de taille 2 (que tu projètes sur un cercle de rayon 1)
que si un point est à une distance x du centre, il faut que tu déformes ton image en le déplaçant à une distance inverse_sinus(x) / (Pi/2) du centre
et ça pour tous les points de ton image

a+
0
Mandrakke Messages postés 4 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 30 mars 2007
29 mars 2007 à 13:06
Salut acx01b,


effectivement, c'etait ma première idée. Néanmoins, il me semble qu'il est relativement difficile de déformer des images comme cela (pixel par pixel), ou tout du moins, je n'ai vraiment aucune idée de la facon dont on peut programmer ceci en opengl.
Il me semble qu'il est plus facile de tricher comme je le propose plus haut.
Mais si tu as un code qui fonctionne pour faire à ton idée, je suis plus que preneur

Petite note: Le cylindre est à l'hrizontal. De plus, je projete mes images par l'exterieur du cylindre, et non par l'interieur. Il faut donc que l'image soit "comprimée" sur les bords hauts et bas et normale au centre.

Merci beaucoup pour ta réponse

Si quelqu'un a une autre idée (ou sait comment réaliser mon idée ou cele de acx01b )...

@+
0
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
29 mars 2007 à 13:47
oui pardon,

tu pars d'une image de largeur 2, et tu obtiens une image courbe de largeur Pi,
et un point distant de x du centre à l'écran devient distant de inverse_sinus(x) du centre sur le cylindre

donc il faut déplacer ton point à une distance sin(x) du centre sur l'écran, pour que après sur le cylindre il soit à une distance x du centre

tout ça pour dire: pourquoi aurais-tu besoin de opengl ??
il n'y a plus de 3d dans l'affaire!
moi je penserais plutôt à une librairie ou une fonction pour faire des "screenshot" de l'écran, genre 40 fois par seconde, et chaque image tu la transforme en la copiant dans un buffer...
pour calculer des sinus y'a un bon moyen: une table de sinus, par exemple si tu as besoin de sinus (en degré) 0.1, 0.2, 0.3.... 359.8 359.9 tu mets toutes les valeurs dans un tableau et résultat c'est hyper rapide car tu les recalcules pas à chaque image
mais avec cette méthode tu auras des "trous" dans l'image déformée, donc il
faut soit que tu remplisses les trous, soit que tu perdes en qualité sur les bords pour qu'au centre tu n'aies pas de trou

après si tu veux rajouter la fonctionnalité "dessinez vous-même la forme cible de déformation" (une sphère au lieu d'un cylindre, ou un cone, une pyramide...) ça peut être une idée, et là oui il vaut mieux utiliser gl

a+
0
Mandrakke Messages postés 4 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 30 mars 2007
29 mars 2007 à 15:02
Re salut acx01b,

Tu as raison, si j'utilise ton idée, je n'ai plus a faire de 3d et donc je n'ai plus besoin de opengl.
Par contre, tu as parfaitement ciblé le concept que je veux réaliser, à savoir: faire 40 screenshot par seconde, les stocker dans le buffer, les deformer, puis les afficher.

Là ou ca coince, c'est que je n'ai pas une formation d'informaticien (malheureusement...) et que je ne sais pas du tout comment programmer cela, ni même avec quel langage le faire.

Bref, si tu pouvais me dire avc quel langage tu programmerai ca et surtout comment, ca m'aiderai beaucoup

Merci encore pour ton aide   

@+
0
Rejoignez-nous