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 :

Libérer mémoire après un new


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Libérer mémoire après un new
    Bonjour,

    depuis un moment je bloque sur un out of memory et je post mon problème afin de savoir si quelqu'un pourrait m'aider à le résoudre.

    Travaillant sur Kinect (SDK 1.0 officiel) et avec OpenCVSharp v2.3 et OpenCv v2.3, j'arrive à afficher les images que je veux, mais au bout d'un moment, ma mémoire est pleine et une OpenCVexception intervient( Failed to allocate 1228820 bytes , outofmemory).

    J'ai localiser le problème :
    Afin de mettre un tableau d'octet dans une CvMat, je suis obliger de faire un CvMat cvmc = new CvMat(480, 640, MatrixType.U8C4, pixC); avec pixC étant un tableau de byte récupérant l'image couleur de la Kinect.
    J'ai tout essayer pour vider la mémoire mais rien n'y fait :
    cvmc.DecRefData(); ou
    cvmc.releaseData(); ou
    Cv.ReleaseMat(cvmc); ou
    GC.collect(); ou encore
    cvmc.dispose();... mais rien n'y fait...

    Voici mon 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
    byte[] pixC = new byte[640 * 480 * 4];
    //fonction qui permet de récuperer le flux vidéo de la kinect (tourne en boucle)
     void kinectsensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)
            {
    //Récupère l'image couleur
                using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
                {
                    if (colorFrame == null)
                    {
                        return;
                    }
    //Copie l'image dans un tableau d'octet (byte)
                    colorFrame.CopyPixelDataTo(pixC);
     
    //Initialisation de la CvMat avec le tableau de byte pixC
                    CvMat cvmc = new CvMat(480, 640, MatrixType.U8C4, pixC);
     
    //Affichage de l'image
                    Cv.ShowImage("essai", cvmc);
    //Un release qui fait rien du tout
                    Cv.ReleaseMat(cvmc);                
                }
    }
    Merci d'avance pour l'aide accorder.

  2. #2
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Points : 47
    Points
    47
    Par défaut
    Salut,

    Bonne idée pour le Dispose(), c'est ce que je t'aurai répondu !
    Je ne peux que te conseiller de poster ton message sur les forums de la MSDN ! Ils sont assez réactifs !

  3. #3
    Membre régulier
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Points : 106
    Points
    106
    Par défaut
    Salut

    Réponse peut être idiote, mais essaie un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    using(CvMat cvmc = new CvMat(480, 640, MatrixType.U8C4, pixC))
    {
    [...]
    }
    Sinon, je ne peux pas trop t'aider, une des motivations à travailler en .NET est de ne plus se faire ch#%! avec la gestion de la mémoire et de laisser le garbage collector faire son boulot. Donc s'il ne fait pas son boulot c'est peut être plus parce que tu essaies d'allouer trop de mémoire (c'est possible ça d'ailleurs avec le swap ?)

    En tout cas, ceci devrait revenir pas mal au même que de faire un dispose() une fois que t'en a fini avec ta classe instanciée...

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    @walloey: Est-ce que ton object cvmc s'enregistre pour des évènements d'un autre objet?

    @androz: using(...) revient à appeler Dispose() à la fin.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    tout d'abord merci de vos réponses.

    @Nixeus : Merci je vais essayer

    @androz : déjà essayer mais cela ne change rien

    @chrisdot : cvmc n'enregistre que l'image couleur de la Kinect et c'est tout.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par chrisdot Voir le message
    @androz: using(...) revient à appeler Dispose() à la fin.
    Mais sauf que le using() est plus clean et tu es sûr de ne pas oublier l'appel à la méthode Dispose() !

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bon j'ai trouver comment résoudre mon erreur (en la contournant).

    Pour ceux que ça intéresse je m'explique :

    je créer en global la cvmat cvmc puis je fait un cv.initMatHandler(cvmc, 480,640,pixC);Voila

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

Discussions similaires

  1. SetLength: libérer la mémoire après usage
    Par j.p.mignot dans le forum Langage
    Réponses: 9
    Dernier message: 10/01/2011, 05h58
  2. Libérer la mémoire aprés utilisation de collection
    Par harris_macken dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 27/03/2008, 00h01
  3. Réponses: 21
    Dernier message: 21/07/2006, 16h55
  4. Vider la mémoire après utilisation d'une feuille excel
    Par snooopy007 dans le forum Access
    Réponses: 15
    Dernier message: 19/07/2006, 20h11
  5. libération de la mémoire après traitement ?
    Par isachat666 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/12/2005, 19h29

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