2017-12-06 2 views
1

Ich verwende OpenCV auf einem RaspberryPi und OpenCVs C-Schnittstelle verwenden.OpenCV leckt Speicher (cvResize, cvCreateImage)

Ich muss die Abmessungen eines Bildes von einer Webcam ändern, daher habe ich die cvResize() Funktion verwendet.

Es funktioniert gut, aber nach ein paar Sekunden habe ich keinen Speicher mehr, da ich den Code in einem while(1) -Loop ausführen und über andere Leute lesen, die dieses Problem haben, vermute ich ein Speicherleck.

Hier ist mein Code:

IplImage *frame; 
IplImage *frameRaw; 

main() { 
    CvCapture *capture = cvCreateCameraCapture(-1); 

    while (1) { 
     frameRaw = cvQueryFrame(capture); 
     frame = cvCreateImage(cvSize(WIDTH, HEIGHT), frameRaw->depth, frameRaw->nChannels); 

     cvResize(frameRaw, frame, 0); // 0 = CV_INTER_NEAREST 

     // Do something with "frame" 
    } 

} 

ich bereits versucht, den reservierten Speicher am Ende jeder Iteration zu befreien mit cvReleaseImage(&frameRaw) (oder &frame), sondern dass immer einen Segmentierungsfehler verursacht. Die Verwendung von cvReleaseImageHeader() verursachte keinen Segmentierungsfehler, aber auch keinen Speicher.

Auch ich habe versucht, die Aufnahme-Auflösung der Bilder über cvSetCaptureProperty() ändern, aber das hat nichts getan.

Kann mir jemand helfen zu verstehen, was hier schief läuft?

Vielen Dank im Voraus

+1

Sind Sie eine zusätzliche Bibliothek? Ich kann nirgendwo cvFreeImage oder cvFreeImageHeader finden. Meinst du cvReleaseImage()? –

+0

Der Code, den Sie zeigen, fehlt definitiv ein 'cvReleaseImage' Aufruf, um mit dem' cvCreateImage' zu ​​gehen - Sie vergeben immer, heben Sie nie auf. Außerdem sollten Sie "frameRaw" nicht freigeben, die Dokumente von "cvQueryFrame" erwähnen das ausdrücklich. –

+0

@bennji_of_the_overflow du hast Recht, ich meinte 'cvReleaseImage()', scheint für mich zu spät zu kommen ... – Panni

Antwort

1

Dank @ DanMašek ich die Lösung gefunden:

Nach jeder while -loop Iteration der zugewiesene Speicher befreit werden für den Rahmen. Dies kann unter Verwendung von cvReleaseImage(&frame) erreicht werden.

Der vollständige Code sieht nun wie folgt aus:

IplImage *frame; 
IplImage *frameRaw; 

main() { 
    CvCapture *capture = cvCreateCameraCapture(-1); 

    while (1) { 
     frameRaw = cvQueryFrame(capture); 
     frame = cvCreateImage(cvSize(WIDTH, HEIGHT), frameRaw->depth, frameRaw->nChannels); 

     cvResize(frameRaw, frame, 0); // 0 = CV_INTER_NEAREST 

     // Do something with "frame" 

     cvReleaseImage(&frame); 
    } 

}