Votre question

Faire pivoter une image en c++

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
28 Janvier 2006 13:21:09

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

Autres pages sur : pivoter image

a b L Programmation
28 Janvier 2006 14:38:07

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.

Anonyme
22 Juin 2009 22:51:48

mais pourqoui tu n'as pas essayer le matlab .il est trés facile pour faire pivoter une image.essayer le!
Contenus similaires
23 Juin 2009 18:53:19

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)
a b L Programmation
23 Juin 2009 19:32:11

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

+1 pour ne pas réinventer la roue :D 
24 Juin 2009 10:01:05

CRicky a dit :
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 ...)
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS