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

C++ Discussion :

convertir une matrice en un vecteur et vis versa


Sujet :

C++

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut convertir une matrice en un vecteur et vis versa
    Bonjour j'ai un code ecrit sur codeblocks l'astuce est simple je dois afficher une image inserer une marque ( le tatouge numérique ) et visionner l'image après insertion de la marque et finalement je dois l'enregistere. tout ceci je l'ai fait le probleme c'est que j'utilise pour l'insertion le scrit de quelqu'un d'autre ( cox & al ) et il utilise l'image comme un vecteur donc je dois convertir l'image en un vecteur . j'ai pu convertir l'image à une matrice mais je n'arrive pas à la convertir en un vecteur ( je vous signal que je suis débutante en C++ et openCV ) donc SVP si quelqu'un peut m aider à trouver le chemin . Merci

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #include <iostream>
    #include "cv.h"
    #include "highgui.h"
    //#include "Globale.h"
    using namespace std;
     
    /*les deux fonctions qui font la convertion entre la matrice
    et l'image */
     
    void mat2image(double **matrice,IplImage *image)
    {
        CvScalar pixel_val;
        int x,y;
        for(x=0; x<image->width; x++)
            for(y=0; y<image->height; y++)
            {
                pixel_val = cvGet2D(image,y,x);//toutes les composantes YCrCb
                pixel_val.val[0] = matrice[x][y];//Y
                cvSet2D(image, y, x,pixel_val);
            }
    }
    void image2mat(IplImage *image, double **matrice)
    {
        CvScalar pixel_val;
        int x, y;
        for(x=0; x<image->width; x++)
            for(y=0; y<image->height; y++)
            {
                pixel_val = cvGet2D(image,y,x);
                matrice[x][y]=pixel_val.val[0];//Y
            }
    }
     
    // Debut du programme
     
    int main(int argc, char** argv)
    {
    //   cout << "Hello world!" << endl;
    //   cout << "Bonjour tout le monde !" << endl;
     
        IplImage *img = cvLoadImage("lena.jpg", 0);// lire l image
        int h = img->height;
        int w = img->width;
        double ** matrice;
        matrice = fl_alloc2d(w ,h);
        image2mat(img,matrice);  // une fonction qui convertit l'iamge en matrice
     
    //ajouter un chiffre à chaque pixel de l'image
        //double matrice[600][600];
        for (int i=0; i<h; i++)
        {
            for (int j=0; j<w; j++)
            {
                matrice[i][j]=  matrice[i][j]+20; // le chiffre ajouter ici est 20
                // c'est juste un exemple
            }
        }
        /*---------------------------------------------------------------------------------------------------
        | normalement au lieu d'avoir une matrice je dois avoir un vecteur donc je dois convertir la matrice |
        | en vecteur ensuite appliquer la marque qui est ici un ajout d'un chiffre et ensuite la convertir   |
        | de nouveau en une matrice ::                                                                       |
        | - convertir matrice en un vecteur :: matrice --> vecteur                                           |
        | - appliquer la marque
        | - convertir vecteur en matrice :: vecteur-->matrice                                                |
        |                                                                                                    |
        -----------------------------------------------------------------------------------------------------*/
     
     
     
        mat2image(matrice,img);  // une fonction qui convertit la matrice en image
        cvNamedWindow("image", CV_WINDOW_AUTOSIZE); //cree un fentre pour afficher l image
        cvShowImage("image", img); // affichage de l image
        cvWaitKey(0); // pause en attendant de paC à l etape suivante
        cvDestroyWindow("image"); // pour detruire l a le
        cvSaveImage("image.bmp",img); // pour enregistrer l'image
        cvReleaseImage( &img ); // liberatuion de memoire
     
        return 0;
    }

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    De manière générale, tu peux considérer que si tu as une matrice de LigneMax lignes et de ColonneMax colonnes, ce que tu veux surtout pouvoir représenter, c'est un ensemble de LigneMax*ColonneMax éléments.

    Ainsi, si tu veux représenter une image composée de 100 pixels de large et de 200 pixels de haut, et que les pixels sont eux même représentés sous la forme de double, tu veux simplement pouvoir représenter 200*100 doubles, ou... 20 000 doubles.

    A partir de là, il est facile de créer un tableau de pixels au lieu d'une matrice de pixels, et ce sera d'ailleurs bien plus sécurisant, entre autres, en termes de résistance aux exceptions. Car, au lieu d'avoir un code qui pourrait ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double ** matrice = new double *[200]; // new peut lancer une exception, que se passera-til alors?
    for (int i = 0; i<200;++i){
        matrice[i] = new double[100]; // neuw peut à chaque passage lancer une exception, 
                                      // que se passera-t-il alors ??
    }
    Qui se retrouve avec 201 possibilités de lancer une exception, tu peux envisager d'avoir un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double *matrice = new double[200*100];
    qui ne risque de lancer une exception qu'une seule fois.

    Si l'on garde les même conventions de LigneMax lignes et ColonneMax colonnes, la "difficulté" est alors d'arriver à accéder à l'élément qui se trouve à la ligne L et à la colonne C. Mais cette difficulté n'en est pas une car il "suffit" d'appliquer la formule pixelDemande = L * ColonneMax + C.

    Tes deux fonctions pourraient donc parfaitement prendre la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void mat2image(double *matrice,IplImage *image)
    {
        CvScalar pixel_val;
         // attention, classiquement, la première valeur corresond à la ligne et la deuxime
         // correspond  à la colonne. C'est du moins la convention que j'utilise ici ;)
        for(int ligne=0; x<image->heigth; x++){
            for(int colonne=0; y<image->width; y++) {
                pixel_val = cvGet2D(image,y,x);//toutes les composantes YCrCb
                pixel_val.val[0] = matrice[ligne* image->width + colonne];//Y
                cvSet2D(image, ligne, colonne,pixel_val);
            }
       }
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void image2mat(IplImage *image, double *matrice)
    {
        CvScalar pixel_val;
         // attention, classiquement, la première valeur corresond à la ligne et la deuxime
         // correspond  à la colonne. C'est du moins la convention que j'utilise ici ;)
        for(int ligne=0; x<image->heigth; x++){
            for(int colonne=0; y<image->width; y++){
                pixel_val = cvGet2D(image,y,x);
                matrice[ligne* image->width + colonne ]=pixel_val.val[0];//Y
            }
        }
    }
    Quant à ta fonction main, elle pourrait ressembler à
    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
    int main(int argc, char** argv)
    {
        IplImage *img = cvLoadImage("lena.jpg", 0);// lire l image
        int h = img->height;
        int w = img->width;
        double * matrice = new double[w*h];
        image2mat(img,matrice);  // une fonction qui convertit l'iamge en matrice
     
    //ajouter un chiffre à chaque pixel de l'image
        //double matrice[600][600];
        for (int i=0; i<h; i++)
        {
            for (int j=0; j<w; j++)
            {
                matrice[i*w+j]=  matrice[i*w+j]+20; // le chiffre ajouter ici est 20
                // c'est juste un exemple
            }
        }
        mat2image(matrice,img);  // une fonction qui convertit la matrice en image
        cvNamedWindow("image", CV_WINDOW_AUTOSIZE); //cree un fentre pour afficher l image
        cvShowImage("image", img); // affichage de l image
        cvWaitKey(0); // pause en attendant de paC à l etape suivante
        cvDestroyWindow("image"); // pour detruire l a le
        cvSaveImage("image.bmp",img); // pour enregistrer l'image
        cvReleaseImage( &img ); // liberatuion de memoire
        delete [] matrice; // tu l'avais oublié, lui :D
        return 0;
    }
    C'est donc plus facile et, ce qui ne gâte rien, c'est qu'il est tout à fait possible que tu gagnes en performances du fait de la continuité des données, qui n'est pas garantie du tout lorsque tu utilise travaille avec des pointeurs de pointeurs

Discussions similaires

  1. transferer une matrice en un vecteur
    Par brf1982 dans le forum MATLAB
    Réponses: 4
    Dernier message: 04/07/2009, 10h20
  2. Réponses: 1
    Dernier message: 05/04/2009, 12h29
  3. Algorithme transformant une matrice en un vecteur de façon spirale
    Par Contact2012 dans le forum Mathématiques
    Réponses: 4
    Dernier message: 26/01/2009, 17h23
  4. convertir une matrice
    Par wawrint dans le forum MATLAB
    Réponses: 6
    Dernier message: 23/05/2008, 17h40
  5. [Débutant] Convertir une matrice 3D en matrice 2D avec chaine de caracteres
    Par grohino dans le forum MATLAB
    Réponses: 6
    Dernier message: 14/05/2008, 16h03

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