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

Python Discussion :

OpenCV et Python 2.4


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 17
    Par défaut OpenCV et Python 2.4
    Bonjour
    J'ai un petit problème avec la librairie OpenCV (traitement d'image) que j'utilise sous Python 2.4.
    Pour mon traitement, je met des images en mémoire que je désalloue ensuite avec la fonction cvReleaseImage. Le problème c'est que Python ne semble pas libérer cette mémoire et la RAM du PC est saturée très vite. Surtout que j'ai des images 800*600 8bit (parfois plus, ca dépend des caméras utilisées)

    J'ai lu que Python 2.4 était buggé au niveau de la gestion mémoire. Est ce à cause de cela que vient mon problème?
    Je pense que Python 2.5 le gère mieux, malheureusement je suis obligé d'utiliser la version 2.4 pour des raisons de compatibilités avec un autre soft.

    Sinon, existe il des solution pour libérer la mémoire?

    Merci

  2. #2
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Je suppose que tu as déjà essayé de forcer la libération mémoire des objets en affectant à None.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    img = Image('fichier.bmp')
    ...
    img = None
    Regarde aussi du côté du module gc (gc.collect())

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 17
    Par défaut
    Merci pour ces conseils, malheureusement, forcer les objets à None ne fonctionne pas, et pour ce qui est du module gc, j'avais déjà regardé de ce coté. Je ne vois pas trop comment l'utiliser, mais bon, je vais m'y plonger un peu plus.

  4. #4
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    L'utilisation de gc est trés simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import gc
     
    gc.collect()
    Cela va transformer toutes les variables à refcount à 0 du statut de "à collecter" à "collectées" et libérer la mémoire associée.

    Pour mémoire :

    Ne fait que placer la variable obj en état "à collecter".

    Donc les 2 astuces sont à utiliser en même temps.

    Pour finir, au vu de ton problème je pencherais plus pour une mauvaise gestion mémoire d'openCV, python 2.4 à ma connaissance n'as pas vraiment de pb mémoire. Essaye d'upgrader openCV ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 17
    Par défaut
    Bon
    J'ai testé pas mal de choses, mais rien ne résoud mon problème. Mais le soucis doit venir de moi car j'ai le même problème avec Python 2.5. Or pour Python 2.5, j'ai utilisé une autre version d'openCV.

  6. #6
    Membre éprouvé Avatar de hunta_kirua
    Profil pro
    Inscrit en
    Février 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 110
    Par défaut
    Salut,

    J'utilise opencv (sous vs c++ par contre) et je n'ai pas problème avec la gestion mémoire (à part ceux que je fais des fois). peux-tu poster la partie du code qui pose problème ?

    A+

    Hunta

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 17
    Par défaut
    Bonjour
    Merci de votre aide
    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    #!/usr/bin/python
    """
    Demo Good Feature avec Harris
    """
     
    import Tkinter 
    import tkFileDialog 
    import sys,os,gc
     
    from opencv.cv import *
    from opencv.highgui import *
     
    storage = cvCreateMemStorage(0)
    #gc.enable( ) 
    #buf=cvAlloc(40000)
    # Global Variables
    points=None;
    src_image=None;
    eigImage=None;
    tempImage=None;
    k = 25
    qualityLevel=1
     
    def update_k( val ):
        cvClearMemStorage( storage );
        global k    # global tag is required, or we get UnboundLocalError
        k = float(val/100.)
        GoodFeature(img)
        print "k: ",k
     
    def update_quality( val ):
        cvClearMemStorage( storage );
        global qualityLevel    # global tag is required, or we get UnboundLocalError
        qualityLevel = float(val/100.)
        if qualityLevel==0:
            qualityLevel=0.01
        GoodFeature(img)
        print "Quality: ",qualityLevel
     
    def GoodFeature(img):
      gc.collect()
      #buf=cvAlloc(4000)
      #conversion en image 8bit (meme si elle l'est deja)
      src_image=cvCreateImage(cvSize(img.width,img.height),IPL_DEPTH_8U,1);
      cvCvtColor( img,src_image,CV_BGR2GRAY );
     
      win_size = 5
      eigImage = cvCreateImage (cvGetSize (src_image), 32, 1)
      tempImage = cvCreateImage (cvGetSize (src_image), 32, 1)
     
     
      minDistance=src_image.width/50
      cornerCount=100
      points = [[], []]
     
      #fonction principale
      points [1] = cvGoodFeaturesToTrack (src_image, eigImage, tempImage,cornerCount,qualityLevel, minDistance, None, 5, 1, k)
     
      #detection subpixelle
      cvFindCornerSubPix (src_image,points [1],cvSize (win_size, win_size), cvSize (-1, -1),cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS,20, 0.03))
     
      #affichage des points trouves en surrimpression
      for the_point in points [1]:
        cvCircle (src_image,[the_point.x, the_point.y],3, cvScalar (0, 255, 255, 0),-1, 8, 0)
     
      cvShowImage( "Harris Corner Detector", src_image );
     
      cvReleaseImage(src_image);
      cvReleaseImage(eigImage);
      cvReleaseImage(tempImage);
     
      #points=None;
      #src_image= None;
      #eigImage=None;
      #tempImage=None;
      #cvFree_(buf)
      del gc.garbage[:]
     
     
    if __name__ == '__main__':
     
        #gc.collect()
     
        cvNamedWindow( "Harris Corner Detector", 1 );
        filename=tkFileDialog.askopenfilename(filetypes = [("All", "*"),("Fichiers image","*.jpg;*.bmp")]) 
        img = cvLoadImage( filename, 1 );
     
        #Création des glissières
        cvCreateTrackbar("Coef K", "Harris Corner Detector", k, 25, update_k);
        cvCreateTrackbar("Quality", "Harris Corner Detector", qualityLevel, 100, update_quality);
     
        GoodFeature(img);
     
        del gc.garbage[:]
        cvWaitKey(0);
     
        cvDestroyWindow("Harris Corner Detector");
    Ce qui est en commentaire, ce sont les différentes choses que j'ai essayé.
    J'ai mis tout le code, comme ca, vous aurez un aprecu global. Pour info, il s'agit d'une fonction qui extrait des points d'intéret sur une image.

    Le truc c'est que je recharge l'image chaque fois qu'on modifie les paramètres.
    Je fait cela, car au final, cette fonction tournera en boucle sur une image caméra. Donc à plusieurs images par secondes, ca risque de vite blinder la RAM malgré les 4Go

  8. #8
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Et pourquoi ne pas allouer tes 3 images src_image, eigImage et tempImage globalement ? Quitte à les passer en paramètres de GoodFeature si tu veux faire l'économie d'une instruction "global ..." ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 17
    Par défaut
    OUF!!!!
    3 jours que je galère, mais j'ai trouvé.
    Il faut utiliser cvReleaseData à la place de cvReleaseImage et tout fonctionne super.

    Merci à vous pour votre aide

  10. #10
    Membre éprouvé Avatar de hunta_kirua
    Profil pro
    Inscrit en
    Février 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 110
    Par défaut
    Re,

    Bon j'ai regarder vite fait ton code (ça me change du c ). J'ai remarqué que tu ne faisais pas de cvReleaseImage avec ton image img, est-ce normal ? A quoi te sert ton storage = cvCreateMemStorage(0), je ne le vois pas utiliser ensuite (mais libérer dans update_k et update_quality ?

    Edit: rectificatif storage est vider mais pas libérer
    Edit 2 : bizarre pour le cvReleaseData au lieu de cvReleaseImage mais bon si ça marche c'est l'essentiel.

    A+

    Hunta

  11. #11
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Génial ! Laisse peut être quand même les cvReleaseImage, ca ne peut pas faire de mal

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 17
    Par défaut
    OK
    Pas bete, merci encore

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

Discussions similaires

  1. Reconnaissance faciale (OpenCv?) avec Python 3.4
    Par an10fp11 dans le forum Bibliothèques tierces
    Réponses: 7
    Dernier message: 30/06/2014, 07h47
  2. traitement d'image: segmentation avec opencv dans python
    Par Bimboucha dans le forum Bibliothèques tierces
    Réponses: 25
    Dernier message: 09/04/2014, 15h14
  3. opencv avec python
    Par gozilla dans le forum Général Python
    Réponses: 5
    Dernier message: 29/12/2010, 10h31
  4. [Python+OpenCv] Lecture Vidéo
    Par vinzrr dans le forum Programmation multimédia/Jeux
    Réponses: 2
    Dernier message: 28/11/2008, 08h54
  5. Installation d'OpenCV pour Python
    Par xenosender dans le forum OpenCV
    Réponses: 0
    Dernier message: 20/11/2007, 23h16

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