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 :

Problème de mémoire


Sujet :

OpenCV

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Problème de mémoire
    Bonjour à tous,

    J'ai fait un petit programme me servant à redimensionner les images d'un répertoire, et à les renommer.

    ça marche assez bien, mais pour les dossiers où il y a beaucoup de beaucoup de photos, ça plante... Je finis par avoir un message d'erreur me disant à peu près :

    Insufficient memory (out of memory), error in function cvAlloc (C:\\...\cxalloc.cpp)


    Voici (en gros) le code
    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
     
    IplImage *Img_in ;
    IplImage *Img_out;
     
    int main(int argc, char** argv)
    {
     
        WIN32_FIND_DATA File;
        HANDLE hSearch;
        BOOL re;
     
        char image_in[50];
        char image_out[100];
        char image_out2[100];
        char repertoire[100];
        char temp[100];
        char repertoire_mini[100];
     
     
        /* Le resultat recherche : un nombre. */
        int nombre_deb = 1;
     
        /* Un booleen pour savoir si la chaine est valide. */
        int ret = 0;
     
    /*
    choix de divers paramètres : dossier, nom de renommage... pas très important je pense par rapport au problème
    */
     
     
        //recherche des images jepg du dossier
        hSearch=FindFirstFile("*.jpg", &File);
        if(hSearch ==  INVALID_HANDLE_VALUE)
        {
            printf("Aucune image trouvee.\n");
           return FALSE;
        }
     
        re=TRUE;
        do
        {
     
            /* construction du nom des images d'entrée (image_in) et de sortie (image_out et image_out2) */
     
            printf("%s %s\n",image_in,image_out);
     
            //on redimensionne en 1024*1024
            redim(1024,1024, image_in,image_out, Img_in, Img_out);
     
            //on crée la miniature et le fichier HTML associé a l'image
            redim2(100,100, image_out,image_out2, Img_in, Img_out);
     
            re = FindNextFile(hSearch, &File);
        } while(re);
     
        FindClose(hSearch);
     
        cvReleaseImage(&Img_in);
        cvReleaseImage(&Img_out);
     
        return 0;
    }
    La fonction redim (redim2 appelle redim() et en plus écrit un fichier HTML)

    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 redim(float l_max, float h_max, char* img_in, char* img_out, IplImage *Img_in, IplImage *Img_out)
    {
     
        int l_in, h_in;
        int l_out, h_out;
        float test_h, test_l;
        CvSize taille_image_in;
     
    	Img_in = cvLoadImage(img_in,CV_LOAD_IMAGE_COLOR);
    	Img_out = 0;//cvLoadImage(img_in,CV_LOAD_IMAGE_COLOR);
    	if (!Img_in){
    		printf("Could not load image file\n");
    		return -1;
    	}
     
      /* divers calculs concernant le redimensionnement */
     
            Img_out = cvCreateImage(cvSize(l_out, h_out),Img_in->depth, Img_in->nChannels);
     
     
            int TYPE_ALGO = CV_INTER_NN;
            cvResize(Img_in,Img_out,TYPE_ALGO);
        }
            if (!cvSaveImage(img_out, Img_out))
                printf("Could not save: %s\n");
     
    	return 0;
    }
    Voilà où j'en suis... je soupçonne fortement un problème lié à l'allocation de mémoire de Img_in et Img_out, mais je ne sais pas comment le résoudre...
    Si quelqu'un peut m'aider, c'est cool ^^

    Merci d'avance !

  2. #2
    Membre actif Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Points : 207
    Points
    207
    Par défaut
    Comment se comporte ta mémoire système utilisée (fuite ou non?)
    Si c'est le cas tu dois avoir oublié un release quelque part.
    Sinon je vois pas trop.
    Tes IplImage sont globales si j'ai bien vu?
    =>
    OpenCv Addict

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    salut,
    ton erreur vient de "cvAlloc" donc je verrais plutôt ça au moment de l'allocation de tes images non?
    L'erreur vient-elle pendant le cvRelease() ? ou bien à l'initialisation de tes images ?
    J'ai déjà eu des problèmes de ce genre lorsque mes IplImage n'était en fait pas bien définit du coup pendant le cvRelease() impossible des les supprimer...
    Sinon peux-tu nous dire comment sont gérées tes images in et out car si elles sont dans un objet elles devraient être supprimées dans le destructeur plutôt non ?
    a+

  4. #4
    Membre actif Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Points : 207
    Points
    207
    Par défaut
    Si tu parles de img_in et img_out ce sont des chaines de caractères donc a priori pas de soucis de ce coté.
    Je penche également pour la première solution que tu évoques
    =>
    OpenCv Addict

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bon, ben le problème semble être résolu... pourtant je suis à peu près sûr que dans mes divers essais, j'avais déjà testé cette solution...
    En fait, j'ai au final mis la déclaration de Img_in et Img_out, ainsi que le cvRelease, dans ma fonction redim().

    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
     
    int redim(float l_max, float h_max, char* img_in, char* img_out)
    {
        int l_in, h_in;
        int l_out, h_out;
        float test_h, test_l;
        CvSize taille_image_in;
     
        IplImage *Img_in; IplImage *Img_out;
     
    Img_in = cvLoadImage(img_in,CV_LOAD_IMAGE_COLOR);
    	Img_out = 0;//cvLoadImage(img_in,CV_LOAD_IMAGE_COLOR);
    	if (!Img_in){
    		printf("Could not load image file\n");
    		return -1;
    	}
     
      /* divers calculs concernant le redimensionnement */
     
            Img_out = cvCreateImage(cvSize(l_out, h_out),Img_in->depth, Img_in->nChannels);
     
            int TYPE_ALGO = CV_INTER_NN;
            cvResize(Img_in,Img_out,TYPE_ALGO);
        }
            if (!cvSaveImage(img_out, Img_out))
                printf("Could not save: %s\n");
     
            cvReleaseImage(&Img_in);
            cvReleaseImage(&Img_out);
     
    	return 0;
    }
    Bref, c'est une variante de la loi de Murphy : il suffit de poser la question à quelqu'un d'autre pour trouver la réponse tout seul, alors que ça fait des heures qu'on est dessus

    Merci quand même à vous 2 !

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

Discussions similaires

  1. [WORD]Problème de mémoire
    Par Dnx dans le forum VBA Word
    Réponses: 17
    Dernier message: 05/10/2005, 14h48
  2. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 14h57
  3. [Crystal Report]Problème de mémoire avec le moteur RDC
    Par sur_uix dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/05/2005, 09h09
  4. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06

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