2010-11-16 12 views
5

Anche solo lo streaming video di base causa una perdita di memoria per me.OpenCV 2.1 Perdita di memoria su streaming video semplice su Mac OSX

cvNamedWindow("1",0); 
CvCapture *fc = cvCaptureFromCAM(0); 
IplImage *frame = NULL; 
CvSize frameSize; 
frameSize.height = cvGetCaptureProperty(fc, CV_CAP_PROP_FRAME_HEIGHT); 
frameSize.width = cvGetCaptureProperty(fc, CV_CAP_PROP_FRAME_WIDTH); 

while (1) { 
    IplImage *wrkImage = NULL; 

    frame = cvQueryFrame(fc); 

    if (!frame) 
     break; 

    wrkImage = cvCreateImage(frameSize, IPL_DEPTH_8U, 3); 
    cvCopy(frame, wrkImage, NULL); 

    cvShowImage("1", wrkImage); 

    char c = cvWaitKey(33); 
    if (c == 27) { 
     break; 
    } 

    cvReleaseImage(&wrkImage); 
} 

A quanto pare secondo il libro "Learning OpenCV", io non dovrei rilasciare "frame" dal momento che è gestito da OpenCV e posso "aspettarsi problemi se lo faccio". In effetti causa problemi se rilascio il puntatore del frame dopo aver chiamato cvQueryFrame. Il libro suggerisce anche di copiare l'immagine puntata da cvQueryFrame altrove per lavorarci sopra poiché cvQueryFrame ricicla presumibilmente lo stesso blocco di memoria ripetutamente. Quindi wrkImage che rilascio alla fine di ogni ciclo di frame. Il programma si interrompe dopo alcuni minuti e perde memoria come un matto! Mi porta a credere che qualcosa di importante viene fatto trapelare come interi fotogrammi. Mi chiedo se qualcuno usa OpenCV 2.1 sul Mac per i video e ha riscontrato che questo è un problema. O se qualcuno può vedere un buco nel mio codice che mi manca.

Qualche consiglio da parte del guru di OpenCV è molto apprezzato!

Modifica: dopo aver esaminato attentamente il programma ed esaminato la memoria, ho il sospetto che il problema sia con cvShowImage(). cvShowImage sembra allocare circa il valore di memoria di un frame che non sembra mai essere recuperato. Quindi ho trovato questo link OpenCV cvShowImage Memory Leaks OSX che sembra essere d'accordo con i miei sospetti. Potrebbe essere vicino a una soluzione qui ... Sono felice di vedere che non sono pazzo!

AGGIORNAMENTO: Macports OpenCV ora funziona bene (e lo è stato per alcuni mesi. Ho pensato che avrei dovuto postarlo qui in modo che le persone non si scoraggino dall'usare Macports per la loro installazione/installazione di OpenCV. modo per installare OpenCV.

+0

Oh e sto usando l'installazione di OpenCV 2.1 di Mac Ports che ho installato 2 settimane fa – wallacer

risposta

0

Non c'è niente di sbagliato nel codice che ho fornito. L'attuale build MacCorts di openCV ha una perdita di memoria nella funzione cvShowImage(). Ho scaricato e creato manualmente la versione più recente e non perde più memoria.

Per chi legge questo, se il tuo programma openCV perde curiosamente memoria, e hai installato MacPorts, ti suggerisco di scaricare l'origine e di costruire manualmente usando cmake.

-1
  1. si sta tentando di ottenere le proprietà di cattura della fotocamera prima di chiamare cvQueryFrame e, a seconda delle circostanze che non possono derivare a ottenere le proprietà corrette. non sembra che è il problema, solo per FYI.

  2. Non c'è alcun motivo per creare un nuovo IplImage. Se tutto ciò che stai tentando di fare è visualizzarlo in una finestra, valuta la possibilità di cambiare il tuo codice di cattura.

Nuovo Loop Capture:

while (true) { 

    frame = cvQueryFrame(fc); 

    if (!frame) 
     break; 

    cvShowImage("1", frame); 

    char c = cvWaitKey(33); 
    if (c == 27) { 
     break; 
    } 

} 

Come lei ha citato nella vostra EDIT, il problema deriva cvShowImage seguita immediatamente da cvReleaseImage, se non avete un motivo per farlo, basta rimuoverlo.

+1

Questo ovviamente non è tutto ciò che stavo cercando di fare. Il mio frammento di codice c'era per mostrare che anche in una situazione estremamente semplice, c'è una perdita di memoria. Quindi sì, c'è una ragione per farlo, e cioè che dovresti copiare i dati delle immagini in una nuova IplImage prima di eseguire operazioni su di essa. – wallacer

+0

Solo cercando di aiutare l'uomo, se non vuoi suggerimenti allora non fare una domanda. – tbridge

+0

non ti ha infiammato, sottolineando solo che esiste davvero un motivo per copiare l'immagine. grazie per la risposta – wallacer