Partage
  • Partager sur Facebook
  • Partager sur Twitter

transposee d'une image - openCV

Sujet résolu
    20 mars 2018 à 14:47:48

    Bonjour, 

    Je dois faire la transposée d'une image sur une matrice non carré

    J'ai fais ceci comme code mais j'ai comme message d'erreur due au makefile de mon prof : Valgrind has detected a memory corruption !

    Mat transpose(Mat image)
    {
        Mat res = Mat::zeros(1,1,CV_32FC1);
        /********************************************
                    YOUR CODE HERE
        hint: consider a non square image
        *********************************************/
        for(int i = 0; i < image.rows; i++)
        {
            for(int j = 0; j < image.cols; j++)
            {
                res.at<float>(j,i) = image.at<float>(i,j); 
            }
        }
        /********************************************
                    END OF YOUR CODE
        *********************************************/
        return res;
    }

    Mais je ne comprends pas où est l'erreur... j'imagine que ca doit etre bete.. 

    -
    Edité par deborahLevy 20 mars 2018 à 14:50:51

    • Partager sur Facebook
    • Partager sur Twitter
      20 mars 2018 à 15:53:48

      Salut,

      la réponse est dans le commentaire ;-)

      // hint: consider a non square image

      Or tu effectues l'opération suivante:

      res.at(j,i) = image.at(i,j); 

      Que se passe-t-il si tu travailles sur une image 1000x50 par exemple ?

      -
      Edité par Orochi 20 mars 2018 à 15:55:27

      • Partager sur Facebook
      • Partager sur Twitter
        20 mars 2018 à 16:03:06

        Orochi a écrit:

        Salut,

        la réponse est dans le commentaire ;-)

        // hint: consider a non square image

        Or tu effectues l'opération suivante:

        res.at(j,i) = image.at(i,j); 

        Que se passe-t-il si tu travailles sur une image 1000x50 par exemple ?

        -
        Edité par Orochi il y a 6 minutes


        ah oui... donc faudrait faire comment quand elle est pas carrée ?
        • Partager sur Facebook
        • Partager sur Twitter
          20 mars 2018 à 16:39:10

          Si la matrice image est de taille rows*cols, il faut que la matrice res soit de taille cols*rows

          D'ailleurs, je n'avais pas fait attention mais tu travailles sur une matrice 1*1, il faut la redimensionner.

          Sinon, deux point sur l'optimisation:

          • inutile de l'initialiser à 1*1 si c'est pour la réallouer dans tous les cas (mais si je comprend bien c'est un bout de code du prof...).
          • Il est préférable de passer la matrice à transposer par référence constante et ainsi éviter une copie inutile.

          -
          Edité par Orochi 20 mars 2018 à 16:40:16

          • Partager sur Facebook
          • Partager sur Twitter
            20 mars 2018 à 16:46:19

            Orochi a écrit:

            Si la matrice image est de taille rows*cols, il faut que la matrice res soit de taille cols*rows

            D'ailleurs, je n'avais pas fait attention mais tu travailles sur une matrice 1*1, il faut la redimensionner.

            Sinon, deux point sur l'optimisation:

            • inutile de l'initialiser à 1*1 si c'est pour la réallouer dans tous les cas (mais si je comprend bien c'est un bout de code du prof...).
            • Il est préférable de passer la matrice à transposer par référence constante et ainsi éviter une copie inutile.

            -
            Edité par Orochi il y a 3 minutes


            je te remercie ! 

            j ai fait ca mais j ai toujours un probleme de mémoire :( 

            Mat transpose(Mat image)
            {
                Mat res = Mat::zeros(1,1,CV_32FC1);
                //cout << res << endl; 
                /********************************************
                            YOUR CODE HERE
                hint: consider a non square image
                *********************************************/ 
                res.cols = image.rows;
                res.rows = image.cols; 
            
                for(int i = 0; i < image.rows; i++)
                {
                    for(int j = 0; j < image.cols; j++)
                    {
                        res.at<float>(j,i) = image.at<float>(i,j);
                    }
                }
                /********************************************
                            END OF YOUR CODE
                *********************************************/
                return res;
            }



            • Partager sur Facebook
            • Partager sur Twitter
              20 mars 2018 à 16:57:00

              Coucou!
              Il me semble qu'openCV est column-major, ce qui signifie que

              image.at<float>(i,j) 

              i représente les colonnes et j représente les lignes, tu as fais l'inverse.

              Tu devrais utiliser un débogueur pour voir à partir de quand tu as l'erreur, ça t'aiderai a comprendre je pense :/ (ou au moins afficher i et j, ainsi que la taille des images, histoire de voir ce quelle valeur va avec quelle quelle variable :) )

              -
              Edité par KirbXCoucou 20 mars 2018 à 17:04:57

              • Partager sur Facebook
              • Partager sur Twitter

              « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
              D. Mendeleïev

                20 mars 2018 à 17:07:13

                KirbXCoucou a écrit:

                Coucou!
                Il me semble qu'openCV est en column-major, ce qui signifie que

                image.at<float>(i,j) 

                i représente les colonnes et j représente les lignes., tu as fais l'inverse.

                Tu devrais utiliser un débogueur pour voir à partir de quand tu as l'erreur, ça t'aiderai a comprendre je pense :/

                le truc c est que je suis sur une machine virtuelle, je code sur virtual studio code mais je ne sais pas comment ajouter un débogueur
                • Partager sur Facebook
                • Partager sur Twitter
                  20 mars 2018 à 17:18:22

                  Ok! Ducoup, moi non plus je sais pas trop. Mais sous machine virtuelle, Visual Studio à pas un débogueur?

                  Sinon pour faire court :
                  Avec certaines techno, les matrices seront comme ça :

                  m(0,0) m(1,0) m(2,0)
                  m(0,1) m(1,1) m(2,1)
                  m(0,2) m(1,2) m(2,2)

                  et d'autres (dont opencv)

                  m(0,0) m(0,1) m(0,2)
                  m(1,0) m(1,1) m(1,2)
                  m(2,0) m(2,1) m(2,2)

                  On remarque que tes (i,j) correspondent pas a la bonne variable.

                  si tu cherches a remplir ret(i,j), alors i représente les colonnes, et j les lignes.
                  Chez moi c'est souvent source d'erreurs en tout cas :/



                  -
                  Edité par KirbXCoucou 20 mars 2018 à 17:18:41

                  • Partager sur Facebook
                  • Partager sur Twitter

                  « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
                  D. Mendeleïev

                    20 mars 2018 à 17:30:31

                    Quand tu construis une matrice, le construteur alloue de la mémoire pour cols*rows éléments donc si tu déclares une matrice 1*1 puis que tu changes la valeur de rows et cols à la main, la mémoire n'a toujours pas bougée.

                    Il faut que tu fasses:

                    res = Mat::zeros(image.cols, image.rows, CV_32FC1);

                    (ou l'inverse, je ne sais plus dans quel est l'ordre des paramètres du constructeur de cv::Mat)

                    à la place de:

                    res.cols = image.rows;
                    res.rows = image.cols

                    Il existe aussi probablement une méthode pour redimensionner une matrice, cela fait longtemps que je n'ai pas utilisé OpenCV.

                    -
                    Edité par Orochi 20 mars 2018 à 17:31:44

                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 mars 2018 à 17:52:30

                      Orochi a écrit:

                      Quand tu construis une matrice, le construteur alloue de la mémoire pour cols*rows éléments donc si tu déclares une matrice 1*1 puis que tu changes la valeur de rows et cols à la main, la mémoire n'a toujours pas bougée.

                      Il faut que tu fasses:

                      res = Mat::zeros(image.cols, image.rows, CV_32FC1);

                      (ou l'inverse, je ne sais plus dans quel est l'ordre des paramètres du constructeur de cv::Mat)

                      à la place de:

                      res.cols = image.rows;
                      res.rows = image.cols

                      Il existe aussi probablement une méthode pour redimensionner une matrice, cela fait longtemps que je n'ai pas utilisé OpenCV.

                      -
                      Edité par Orochi il y a 11 minutes

                      merci beaucoup c etait ça le probleme ! 

                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 mars 2018 à 8:22:20

                        Oups ! :-° désolé j'avais pas tout lu, je croyais que tu avais corrigé après le message de Orochi :/ :-°
                        • Partager sur Facebook
                        • Partager sur Twitter

                        « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
                        D. Mendeleïev

                        transposee d'une image - openCV

                        × 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