IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Elle fait tourner la tête


Sujet :

OpenCV

  1. #1
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut Elle fait tourner la tête
    Bonjour,
    Je me retrouve bloqué sur la rotation d'une image à 90°. Ma matrice est nulle apparemment, et le programme s'arrête du coup
    Comment faire?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CvPoint center;
    CvMat MapMatrix;
    double angle=90, scale=1;
    center.x = img->width/2;
    center.y = img->height/2;
    cvInitMatHeader(&MapMatrix, 2, 3, CV_64FC1, NULL ,CV_AUTOSTEP );
    cv2DRotationMatrix( cvPointTo32f(center), angle, scale, &MapMatrix );
    cvTransform( img, img, &MapMatrix, NULL );

  2. #2
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    IplImage* myRotate(IplImage* src, double angle)
    {
    IplImage* dst;
    //destination image
    angle = (CV_PI* (angle/180));
    //transform to radian measure
    int newheight =int (fabs(( sin(angle)*src->width ))
    +fabs(( cos(angle)*src->height )) );
    int newwidth =int (fabs(( sin(angle)*src->height))
    +fabs(( cos(angle)*src->width)) );
    dst = cvCreateImage(cvSize(newwidth,newheight),
    IPL_DEPTH_8U, 3);
    cvFillImage(dst,0);
    //create desstination image using new size

    for(int y=0;y < newheight;y++) //set dst BRG value
    for(int x =0;x < newwidth;x++)
    {
    double xx = (x-(newwidth)/2)*cos(-angle)+
    (newheight/2-y)*(-sin(-angle));
    double yy = (x-(newwidth)/2)*sin(-angle)+
    (newheight/2-y)*(cos(-angle));
    xx =xx + src->width/2;
    yy = src->height/2 - yy;
    int xxx = floor(xx);
    int yyy = floor(yy);
    int xxx1=xxx+1;
    int yyy1=yyy+1;

    if (xxx >= 0 && yyy>=0 && xxx < src->width
    && yyy < src->height)
    {
    unsigned char b1=((uchar*)(src->imageData
    +src->widthStep*yyy))[xxx*3];
    unsigned char b2=((uchar*)(src->imageData
    +src->widthStep*yyy))[(xxx1)*3];
    unsigned char b3=((uchar*)(src->imageData
    +src->widthStep*(yyy1)))[xxx*3];
    unsigned char b4=((uchar*)(src->imageData
    +src->widthStep*(yyy1)))[(xxx1)*3];
    unsigned char r1=((uchar*)(src->imageData
    + src->widthStep*yyy))[xxx*3+1];
    unsigned char r2=((uchar*)(src->imageData
    + src->widthStep*yyy))[(xxx1)*3+1];
    unsigned char r3=((uchar*)(src->imageData
    + src->widthStep*(yyy1)))[xxx*3+1];
    unsigned char r4=((uchar*)(src->imageData
    + src->widthStep*(yyy1)))[(xxx1)*3+1];
    unsigned char g1=((uchar*)(src->imageData
    + src->widthStep*yyy))[xxx*3+2];
    unsigned char g2=((uchar*)(src->imageData
    + src->widthStep*yyy))[(xxx1)*3+2];
    unsigned char g3=((uchar*)(src->imageData
    + src->widthStep*(yyy1)))[xxx*3+2];
    unsigned char g4=((uchar*)(src->imageData
    + src->widthStep*(yyy1)))[(xxx1)*3+2];
    (dst->imageData + dst->widthStep*y)[x*3]=b1+(b2-b1)*(xx-
    xxx) + ( b3+(b4-b3)*(xx-xxx) - (b1+(b2-b1)*(xx-xxx)) )*(yy-yyy);
    (dst->imageData + dst->widthStep*y)[x*3+1]=r1+(r2-r1)*(xx-
    xxx)+(r3+(r4-r3)*(xx-xxx)-(r1+(r2-r1)*(xx-xxx)))*(yy-yyy);
    (dst->imageData + dst->widthStep*y)[x*3+2]=g1+(g2-g1)*(xx-
    xxx)+(g3+(g4-g3)*(xx-xxx)-(g1+(g2-g1)*(xx-xxx)))*(yy-yyy);
    }
    }
    return dst;
    }

  3. #3
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    Ce code me retourne de 90° complètement l'image!
    Moi je ne voudrais qu'une rotation de 90° DANS l'image (et non pas du fichier donc) afin de garder des bonnes valeurs de Width et Height, quelqu'un a une idée ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Si ta rotation se limite à 90° il y a aussi cette solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    void imageRt90 (IplImage ** img)
    {
     
            float B[3][3] = { {1,0,0}, {0, 1, 0}, {0, 0, 1} };
            CvMat map_matrixQuad = cvMat( 3, 3, CV_32F, &B[0][0] );
     
            CvPoint2D32f startQuad[4];
     
            CvPoint2D32f transformedQuad[4];
    	startQuad[0].x = 0;
    	startQuad[0].y = 0;
    	startQuad[1].x = 0;
    	startQuad[1].y = (*img)->height; 
    	startQuad[2].x = (*img)->width;
    	startQuad[2].y = (*img)->height;
    	startQuad[3].x = (*img)->width;
    	startQuad[3].y = 0;
     
    	transformedQuad[0].x = 0;
    	transformedQuad[0].y = (*img)->height;
    	transformedQuad[1].x = (*img)->width;
    	transformedQuad[1].y = (*img)->height;
    	transformedQuad[2].x = (*img)->width;
    	transformedQuad[2].y = 0;
    	transformedQuad[3].x = 0;
    	transformedQuad[3].y = 0;
     
    	// Créer un transfomation perspective d'une rotation a 90° anti-trigo
    	cvGetPerspectiveTransform( transformedQuad,startQuad , &map_matrixQuad );
    	IplImage* temp=cvCreateImage(cvGetSize((*img)),(*img)->depth,(*img)->nChannels);
    	// Effectue la rotation 90°
    	cvWarpPerspective( (*img), temp, &map_matrixQuad);
    	(*img)=cvCloneImage(temp);
    	cvReleaseImage(&temp);
    }

  5. #5
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    whou...merci !
    Mais oui le souci c'est que des fois faut tourner l'image d'un angle précis et différent de 90 ou de 180 (d'ailleurs pour 180 je suppose que j'utilise ta fonction deux fois d'afilée ?!)

    Merci beaucoup pour le code !!!

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    En fait pour 180 tu as juste à changer transformedQuad en conséquence.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            transformedQuad[0].x = (*img)->width;
    	transformedQuad[0].y = (*img)->height;
    	transformedQuad[1].x = (*img)->width;
    	transformedQuad[1].y = 0;
    	transformedQuad[2].x = 0;
    	transformedQuad[2].y = 0;
    	transformedQuad[3].x = 0;
    	transformedQuad[3].y = (*img)->height;
    Par contre pour ce qui des angles intermédiaires il faut faire un peut Pythagore et tu dois pourvoir trouvé les valeurs à mettre ...

  7. #7
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    whaou...merci !

  8. #8
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void RotationImage(IplImage* iBuf, IplImage** oBuf, int angle)
    {
        IplImage* lTamp = cvCloneImage(iBuf);
        float lRotateValues[6];
        lRotateValues[0] = (float)(cos(angle*CV_PI/180.));
        lRotateValues[1] = (float)(sin(angle*CV_PI/180.));
        lRotateValues[3] = -lRotateValues[1];
        lRotateValues[4] =  lRotateValues[0];
        lRotateValues[2] = iBuf->width  *0.5f;  
        lRotateValues[5] = iBuf->height *0.5f; 
     
        CvMat lRotateMatrix = cvMat(2, 3, CV_32F, lRotateValues);
        cvGetQuadrangleSubPix(iBuf,lTamp,&lRotateMatrix); 
     
        *oBuf = lTamp;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.4] simplexml_load_file me fait tourner la tête!
    Par akkyshan dans le forum Langage
    Réponses: 8
    Dernier message: 18/10/2012, 17h44
  2. le menu qui n'en fait qu'à sa tête
    Par Invité dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 09/11/2006, 11h32
  3. [Débutant][Taille BD]Meme vide elle fait 25 Mo
    Par exe dans le forum Débuter
    Réponses: 3
    Dernier message: 18/08/2003, 19h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo