none
Libérer la mémoire après un new RRS feed

  • Question

  • 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

    using(CvMat cvmc = new CvMat(480,640,MatrixType.U8C4,pixC))

    {...}

    ou encore
    cvmc.dispose();...
    mais rien n'y fait...

    Voici mon code :

    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.


    • Modifié Walloey vendredi 17 février 2012 10:01
    vendredi 17 février 2012 10:00

Réponses

  • 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

    Walloey

    vendredi 17 février 2012 14:35

Toutes les réponses