Tom's Guide > Forum > Programmation > Faire pivoter une image en c++
Mot :    Pseudo :           
 

Bonjour à tous !!

Voila mon probleme : je cherche un programme en c++ pour pouvoir faire pivoter une image de 90 ou 180°. Je pense avoir compris le concept il suffit de prendre la premiere ligne de code et la remplacer avec la derniere et ainsi de suite pour pivoter de 180° par exemple... Mais rien de bien concret.. si vous avez une piste n'hésitez pas !! Je travaille sous Dev C++

Merci d'avance

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

pour faire une rotation, qu'elle soit de 90°, 180° ou autre (30° par exemple), il faut toujours boucler sur les pixels de l'image finale car dans le cas où l'on a pas 90°, on saute des pixels.

Ensuite, il ne faut pas réfléchir à savoir quel sens en fonction de l'angle. Il suffit d'appliquer un modèle mathématique.
Si tu connais les matrices de rotation, il faut les utiliserles matrices:
(x', y',1) = ((cos θ, -sin θ, 0)(sin θ, cos θ, 0)(0,0,1)) (x, y,1)
Bon ça va faire une rotation d'axe (0,0), donc si tu veux faire une rotation autour de (x0, y0), il faut faire une translation par la matrice de translation:
((1,0,0)(0,1,0)(x0,y0,1)).
Pour faire la rotation autour de (x0, y0), on déplace tout du point central vers l'origine (0,0), puis on fait la rotation autour de (0,0), et on refait la translation opposée pour tout remettre au bon endroit.
On a donc la matrice R(x0, y0) = T(-x0, -y0) * R(0,0) * T(x0, y0)
soit R(x0, y0) = ((1,0,0)(0,1,0)(-x0,-y0,1)) * ((cos θ, -sin θ, 0)(sin θ, cos θ, 0)(0,0,1)) * ((1,0,0)(0,1,0)(-x0,-y0,1))
on calcule le produit et on multiplie la matrice par le vecteur [x;y;1], pour obtenir le resultat:
x' = cosθ * x - sinθ * y + (cosθ - 1) * x0 - sinθ * y0
y' = sinθ * x + cosθ * y + sinθ * x0 + (cosθ - 1) * y0

Bon j'ai fait les calculs à l'envers lol
puisque j'ai dit qu'il fallait partir du pixel final, pour trouver à quel pixel ça correspond sur l'image d'origine, donc il faut prendre, -θ au lieu de θ:

x = cosθ * x' + sinθ * y' + (cosθ - 1) * x0 - sinθ * y0
y = -sinθ * x' + cosθ * y' - sinθ * x0 + (cosθ - 1) * y0

voilà, j'espère ne pas me tromper. x' et y' son les positions du pixel courant dans l'image après rotation, et x et y sont les position du même pixel dans l'image d'origine.

si on prend θ = 90°, on a cosθ = 0 et sinθ = 1:
x = y' - x0 - y0
y = - x' - x0 - y0

Bon je me suis peut-être trompé dans les signes mais en gros c'est ça.
EDIT:certainement même, faudrait peut-être prendre -x0 au lieu de x0 et -y0 au lieu de y0.
Voilà tu peux faire une rotation de n'importe quel angle.
Après quand tu fais ta rotation, tu ne va pas forcément tomber sur un pixel (x ,y) exact sur l'image d'origine. Ici plusieurs possibilités:
- soit tu arrondis simplement pour prendre le pixel à gauche
- soit tu trouves le pixel le plus proche pour être proche de la réalité
- soit tu fait une interpolation selon la distance des 4 pixels qui l'entourent en calculant la couleur pondérée par la distance.

Voilà, ben en fait, pour la 3D, c'est exactement le même principe, sauf que la matrice (qui sont de 4x4 au lieu de 3x3) de rotation se fait sur un axe, et qu'il faut combiner les rotation par les mêmes multiplications.

Répondre à CRicky

mais pourqoui tu n'as pas essayer le matlab .il est trés facile pour faire pivoter une image.essayer le!

Répondre à Anonyme

Sous Windows, ça se fait tout seul avec l'api Win32 (cf http://tinyurl.com/cvd7wv)
( jamais de libs externes sous Win32, puisque l'api fait tout en 3 lignes de code à chaque fois)

Répondre à lucas666

La remontée de topic pour parler de matlab :)

+1 pour ne pas réinventer la roue :D

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

CRicky a écrit :

La remontée de topic pour parler de matlab :)

+1 pour ne pas réinventer la roue :D




C'est pour ca que j'ai supprimé mon post .... j'ava posté trop vite sans voir le troll ..
(mais voui ... la roue ca roule ...)

Répondre à elendilm
Tom's Guide > Forum > Programmation > Faire pivoter une image en c++
Aller à :

Il y a 253 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Liens