OpenCV release memory
-
Hallo,
ich habe ein memory Problem mit OpenCV. Wie kann ich memory eines pointers, den ich zurückgebe, in der aufrufenden Funktion "releasen"?
Hier ist mein Code:Dies ist die Funktion, in der ich die Funktion thinning aufrufe:
int preprocessing_and_classification() { /// Section 2D - Perform morphological processing CvMat* image1_edge_morpho = thinning(image1_edge); ....... ....... ........... //////////////// release the memory /////////////// cvReleaseImage(&img); cvReleaseMat(&image1); cvReleaseMat(&image1_edge); cvReleaseMat(&image1_edge_morpho); cvReleaseImage(&imgg); cvReleaseImage(&imggT); cvReleaseMemStorage(&g_storage); cvReleaseMat(&features); cvReleaseMat(&labels_obtained); ///////////////////////////////////////////////////// return num_bacilli; }Die Funktion thinning sieht folgendermaßen aus und gibt den Pointer Merode zurück:
CvMat* thinning(CvMat* M){ /* Input parameters CvMat* M = Pointer to the matrix on which morphological processing needs to be done. Output parameters CvMat* Merode = Pointer to morphological processed matrix. */ CvMat* Merode = cvCreateMat(h,w,CV_8UC1); . . . . . . ///// Releasing the images, matrices and structuring elements to free memroy. // Matrix Merode is not released as it is the output of this funtion file cvReleaseStructuringElement(&B); cvReleaseMat( &Mopen ); cvReleaseMat( &temp ); cvReleaseMat( &Mclose ); cvReleaseMat( &temp1 ); cvReleaseMat( &MM ); cvReleaseImage( &img1 ); cvReleaseMemStorage(&g_storage); cvReleaseMat( &Mimg1 ); cvReleaseMat( &Mimg2 ); return Merode; }Wie kann ich nun diesen wieder löschen ?!?!
Über Hilfe wäre ich euch sehr dankbar
-
Du gibst ja Speicher frei in Zeile 14 des ersten Snippets.. (kann aber nicht sagen ob das überhaupt korrekt ist so)
Im übrigen würde ich dir auch raten die C++ Schnittstelle zu benutzen. Da musst du dich nicht um solches Zeugs kümmern.
Siehe z.B hier.
-
Danke für die Antwort. Das heisst in Zeile 14 gebe ich automatisch auch den Memory des zurückgegebenen Pointers frei ?
-
@starter88: Wenn du übrigens keine Lust mehr auf das unhandliche uralte C-Interface mit dem ganzen manuellen Freigeben und so hast, empfehle ich dir, mal das C++-Interface, dass es ab Verion 2.0 gibt, anzuschauen. Da ist die Matrix eine praktische Klasse (cv::Mat), die dir sehr viel dieser nervigen Arbeit abnimmt.

Edit: Ups, hatte nicht gesehen, dass drakon darüber ja auch schon geschrieben hatte.
-
Das Problem ist, dass die Funktion bereits geschrieben sind(nicht von mir). Um das alles umzuschreiben wäre in meinem Fall ein großer Aufwand!
-
Ich kenne mich eben mit dem alten Interface nicht aus, weil ichs nie benutzt habe. Aber wenn der Code bereits geschrieben ist warum gehst du dann davon aus, dass dort ein Fehler ist? Was bringt dich zur Annahme, dass der Speicher nicht freigegeben wird?
-
Hey,
ich habe manche Funktionen nicht selbst geschrieben. Ich habe aber in diese Funktionen reingeschaut und überall die Release Befehle eingefügt. Diese waren vorher nicht vorhanden. Ich lasse nebenher den Task Manager laufen und der verbrauchte Arbeitsspeicher wird angezeigt. Das Programm hat vorher immer nach dem 20ten Schleifendurchlauf aufgehört da all der Speicher voll war. Nachdem ich die Release-Funktionen an allen Stellen eingefügt hatte, durchlief es die Schleife ca. 100 mal. Deshalb möchte ich an allen Stellen, wo nur möglich, diese Release-befehle einfügen.
Der andere Teil der vermutlich noch Speicher beansprucht, sind das Speichern und wiederrum Löschen von Bildern. Aber das ist ein anderes Thema.
Ich hoffe ich konnte dir das einigermaßen erklären, was das Problem ist
Danke !!
-
Naja. Ich befürchte, dass, wenn vorher wirklich nicht auf Speicher geschaut wurde der benutzte Code noch andere Mängel hat.
Ich empfehle wirklich so gut es geht auf die andere Schnittstelle zu setzen. Gibt sicher auch Funktionen, mit denen du den alten Code zum Teil behalten kannst (spezielle Konstruktoren z.B).