Partage
  • Partager sur Facebook
  • Partager sur Twitter

convertir une matrice en un vecteur et vis versa

opencv

    4 février 2014 à 16:17:16

    Bonjour j'ai un script 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 
    #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;
    }
    



    • Partager sur Facebook
    • Partager sur Twitter
      4 février 2014 à 16:29:15

      Lu'!

      1) On écrit pas de "script"  en C++, c'est pas du Matlab.

      2) Utilise la version C++ de OpenCV et tout rentrera dans l'ordre pour plusieurs raisons :

      • tu n'auras plus 50 pointeurs et des pointeurs sur pointeur et whatever
      • les types OpenCV C++ sont 100 fois plus simples à utiliser que leurs homologues C (d'ailleurs, il me semble que IplImage est deprécié)
      • tu arrêteras de pré-déclarer des variables

      Voir du côté de cv::Mat.

      • Partager sur Facebook
      • Partager sur Twitter

      Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

        4 février 2014 à 16:44:09

        Ksass`Peuk a écrit:

        Lu'!

        1) On écrit pas de "script"  en C++, c'est pas du Matlab.

        2) Utilise la version C++ de OpenCV et tout rentrera dans l'ordre pour plusieurs raisons :

        • tu n'auras plus 50 pointeurs et des pointeurs sur pointeur et whatever
        • les types OpenCV C++ sont 100 fois plus simples à utiliser que leurs homologues C (d'ailleurs, il me semble que IplImage est deprécié)
        • tu arrêteras de pré-déclarer des variables

        Voir du côté de cv::Mat.

        c'est vrai pour le script merci pour me l'avoir dit ; bon si j'utilise le cv::Mat ça convertit une matrice en un vecteur 



        • Partager sur Facebook
        • Partager sur Twitter
          4 février 2014 à 16:57:17

          mitchecool a écrit:

          bon si j'utilise le cv::Mat ça convertit une matrice en un vecteur 

          Pour toi, quelle est la différence entre une matrice et un vecteur ? Pour ma part, d'un point de vue mémoire, la matrice peut parfaitement être représentée par un vecteur. Et donc l'algo qui marche pour un marche pour l'autre (et dans les deux sens).

          En fait je n'arrive littéralement pas à voir quel est ton problème. Comment comptes-tu utiliser ce vecteur ?

          • Partager sur Facebook
          • Partager sur Twitter

          Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

            4 février 2014 à 17:39:12

            Ksass`Peuk a écrit:

            mitchecool a écrit:

            bon si j'utilise le cv::Mat ça convertit une matrice en un vecteur 

            Pour toi, quelle est la différence entre une matrice et un vecteur ? Pour ma part, d'un point de vue mémoire, la matrice peut parfaitement être représentée par un vecteur. Et donc l'algo qui marche pour un marche pour l'autre (et dans les deux sens).

            En fait je n'arrive littéralement pas à voir quel est ton problème. Comment comptes-tu utiliser ce vecteur ?


            oui je suis d'accord avec toi qu'une matrice peut etre representé sous forme de vecteur . mais quand je dis matrice c'est comme si j'ai un tableau 2D par contre un vecteru est tout simplement un tableau avec une seule ligne et n colonne 

            • Partager sur Facebook
            • Partager sur Twitter
              5 février 2014 à 9:45:20

              mitchecool a écrit:

              oui je suis d'accord avec toi qu'une matrice peut etre representé sous forme de vecteur . mais quand je dis matrice c'est comme si j'ai un tableau 2D par contre un vecteru est tout simplement un tableau avec une seule ligne et n colonne 

              Moi en ce qui me concerne une matrice c'est une classe qui en interface publique me propose ceci :

              template<class T>
              class Matrix{
              public :
                explicit Matrix(T const& val = T{});
                Matrix(uint w, uint h, T const& val = T{});
                Matrix(Matrix const&);
                Matrix& operator= (Matrix const&);
              
                ~Matrix();
              
                //des opérations
              
                //un accès :
                T const& operator()(uint x, uint y) const;
                T & operator()(uint x, uint y);
               
              private:
                //détails d'implémentation dont on se fout
              };

              Et c'est par quelque chose comme ça que tu devrais passer : à partir de là, tu te fous de savoir si c'est un pointeur de pointeur ou un pointeur simple, ou un vecteur. C'est une matrice.

              Et tu n'as pas répondu à la question la plus importante :

              Ksass`Peuk a écrit:

              En fait je n'arrive littéralement pas à voir quel est ton problème. Comment comptes-tu utiliser ce vecteur ?

              Parce que je ne vois pas quel problème tu peux bien avoir. Si on a pas le prototype de la fonction que tu veux utiliser, on peut difficilement voir de quoi tu as besoin et pourquoi ...

              -
              Edité par Ksass`Peuk 10 juillet 2014 à 14:17:02

              • Partager sur Facebook
              • Partager sur Twitter

              Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

                5 février 2014 à 15:38:27

                Ksass`Peuk a écrit:

                mitchecool a écrit:

                oui je suis d'accord avec toi qu'une matrice peut etre representé sous forme de vecteur . mais quand je dis matrice c'est comme si j'ai un tableau 2D par contre un vecteru est tout simplement un tableau avec une seule ligne et n colonne 

                Moi en ce qui me concerne une matrice c'est une classe qui en interface publique me propose ceci :

                template<class T>
                class Matrix{
                public :
                  Matrix();
                  Matrix(uint w, uint h);
                  Matrix(Matrix const&);
                  Matrix& operator= (Matrix const&);
                
                  ~Matrix();
                
                  //des opérations
                
                  //un accès :
                  T const& operator()(uint x, uint y) const;
                  T & operator()(uint x, uint y);
                 
                private:
                  //détails d'implémentation dont on se fout
                };

                Et c'est par quelque chose comme ça que tu devrais passer : à partir de là, tu te fous de savoir si c'est un pointeur de pointeur ou un pointeur simple, ou un vecteur. C'est une matrice.

                Et tu n'as pas répondu à la question la plus importante :

                Ksass`Peuk a écrit:

                En fait je n'arrive littéralement pas à voir quel est ton problème. Comment comptes-tu utiliser ce vecteur ?

                Parce que je ne vois pas quel problème tu peux bien avoir. Si on a pas le prototype de la fonction que tu veux utiliser, on peut difficilement voir de quoi tu as besoin et pourquoi ...

                -
                Edité par Ksass`Peuk il y a environ 5 heures

                ok voici la fonction que je vais utilisé ( c'est la marque que je dois insere dans l'image ) 

                *--------------------------------------------------------------------------*
                 | E_BLIND -- embed a watermark by simply adding a message pattern          |
                 |                                                                          |
                 | Arguments:                                                               |
                 |   c -- image to be watermarked (changed in place)                        |
                 |   width -- width of img                                                  |
                 |   height -- height of img                                                |
                 |   m -- one-bit message to embed                                          |
                 |   alpha -- embedding strength                                            |
                 |   wr -- reference pattern (width x height array of doubles)              |
                 |                                                                          |
                 | Return value:                                                            |
                 |   none                                                                   |
                 *--------------------------------------------------------------------------*/
                
                void E_BLIND( unsigned char *c, int width, int height,
                              int m, double alpha, double *wr )
                {
                  static double wm[ MAX_IMG_SIZE ];    /* pattern that encodes m */
                
                  /* Encode the message in a pattern */
                  ModulateOneBit( m, wr, wm, width, height );
                
                  /* Scale and add pattern to image (with clipping and rounding) */
                  AddScaledPattern( c, width, height, alpha, wm );
                }
                /*--------------------------------------------------------------------------*
                 | ModulateOneBit -- encode a one-bit message by either copying or negating |
                 |                   a given reference pattern                              |
                 |                                                                          |
                 | Arguments:                                                               |
                 |   m -- message to be encoded                                             |
                 |   wr -- reference pattern                                                |
                 |   wm -- where to store resulting message pattern                         |
                 |   width -- width of wm                                                   |
                 |   height -- height of wm                                                 |
                 |                                                                          |
                 | Return value:                                                            |
                 |   none                                                                   |
                 *--------------------------------------------------------------------------*/
                
                void ModulateOneBit( int m, double *wr, double *wm, int width, int height )
                {
                  int i;                               /* index into patterns */
                
                  if( m == 0 )
                    for( i = 0; i < width * height; i = i + 1 )
                      wm[ i ] = -wr[ i ];
                  else
                    for( i = 0; i < width * height; i = i + 1 )
                      wm[ i ] = wr[ i ];
                }
                
                /*--------------------------------------------------------------------------*
                 | AddScaledPattern -- scale and add a pattern to an image with clipping    |
                 |                     and rounding                                         |
                 |                                                                          |
                 | This multiplies w by alpha to obtain the added pattern, and adds         |
                 | it to c, clipping and rounding each pixel to an 8-bit integer.           |
                 |                                                                          |
                 | Arguments:                                                               |
                 |   c -- image to which to add pattern (changed in place)                  |
                 |   width -- width of image                                                |
                 |   height -- height of image                                              |
                 |   alpha -- scaling factor                                                |
                 |   w -- pattern to scale and add (width times height array of doubles)    |
                 |                                                                          |
                 | Return value:                                                            |
                 |   none                                                                   |
                 *--------------------------------------------------------------------------*/
                
                void AddScaledPattern( unsigned char *c, int width, int height,
                                       double alpha, double *w )
                {
                  int i;                               /* pixel index */
                
                  for( i = 0; i < width * height; i = i + 1 )
                    c[ i ] = ClipRound( (double)c[ i ] + alpha * w[ i ] );
                }
                /*--------------------------------------------------------------------------*
                 | ClipRound -- clip and round a real value to an 8-bit integer             |
                 |                                                                          |
                 | Arguments:                                                               |
                 |   v -- real value                                                        |
                 |                                                                          |
                 | Return value:                                                            |
                 |   clipped and rounded value                                              |
                 *--------------------------------------------------------------------------*/
                
                int ClipRound( double v )
                {
                  int iv;                              /* clipped and rounded value */
                
                  if( v < 0 )
                    iv = 0;
                  else if( v > 255 )
                    iv = 255;
                  else
                    iv = (int)floor( v + .5 );
                
                  return iv;
                }

                donc ici le c qui represente l'image est utilisé sous forme de vectuer c'est pour cela que moi je veux convertir la matrice que j'ai en un vecteur . 


                • Partager sur Facebook
                • Partager sur Twitter
                  5 février 2014 à 15:47:13

                  Génial ... du langage C. Avec des cast complètement laids partout.

                  Tu as deux choix possibles, tout passer en C ou tout passer en C++ (à noter que globalement tu es plus proche du langage C que du C++ - laaaaaaargement). Fin bon même en C, le code est vraiment pas top.

                  En gros :

                  • pour tout passer en C, c'est pas trop compliqué : tu vires iostream/"using namespace std;" (que tu as mis alors qu'ils ne sont pas utilisés) et tu vérifies que la fonction fl_alloc_2D est une fonction codée en C (chances très élevées). Ensuite, tu fais un unsigned char* de [w*h] en taille et tu copies la matrice ligne par ligne dedans.
                  • pour tout passer en C++, grosso modo, passer sur cv::Mat et réécrire les fonctions E_BLIND/etc ... pour qu'elles prennent en paramètres des cv::Mat, tout en virant tous les pointeurs moches au passage (pas trop compliqué non-plus).
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

                  convertir une matrice en un vecteur et vis versa

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown