2010-11-16 14 views
5

Nawet samo wykonywanie najbardziej podstawowych strumieni wideo powoduje wyciek pamięci dla mnie.Przeciek pamięci OpenCV 2.1 na proste przesyłanie strumieniowe wideo w systemie 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); 
} 

Widocznie według książki „Learning OpenCV”, ja nie mam do wydania „ramkę” ponieważ jest zarządzany przez OpenCV i mogę „spodziewać się problemów, jeśli to zrobię”. Rzeczywiście powoduje problemy, jeśli zwolniam wskaźnik ramki po wywołaniu cvQueryFrame. Książka sugeruje również skopiowanie obrazu wskazanego przez cvQueryFrame gdzie indziej, aby pracować nad nim, ponieważ cvQueryFrame prawdopodobnie ponownie przetwarza ten sam kawałek pamięci wielokrotnie. Stąd wrkImage, który wydajemy na koniec każdego cyklu ramek. Program ulega awarii po kilku minutach i wycieka pamięć jak szalona! Prowadzi mnie do przekonania, że ​​coś poważnego wycieka jak całe ramy. Zastanawiam się, czy ktokolwiek używa OpenCV 2.1 na Macu do filmów wideo i stwierdził, że jest to również problem. Albo, jeśli ktoś widzi w moim kodzie dziurę, której mi brakuje.

Każda rada guru OpenCV jest bardzo cenna!

Edytuj: Po uważnym przejściu programu i sprawdzeniu pamięci podejrzewam, że problem dotyczy cvShowImage(). Wygląda na to, że cvShowImage przydziela pamięć o wartości pamięci RAM, która nigdy nie zostanie odzyskana. Następnie znalazłem ten link OpenCV cvShowImage Memory Leaks OSX, który wydaje się zgadzać z moimi podejrzeniami. Może być tu blisko rozwiązania ... Cieszę się, że nie jestem szalona!

AKTUALIZACJA: Macports OpenCV jest już w porządku (i już od kilku miesięcy.) Pomyślałem, że powinienem opublikować to tutaj, aby ludzie nie byli zniechęcani do używania Macportów do ich kompilacji/instalacji OpenCV. sposób zainstalować OpenCV.

+0

Och i używam instalacji Mac Ports z OpenCV 2.1, którą zainstalowałem 2 tygodnie temu – wallacer

Odpowiedz

0

Nie ma nic złego w dostarczonym kodzie. Obecna wersja OpenCV w MacPorts ma przeciek pamięci w funkcji cvShowImage(). Pobrałem i zbudowałem najnowszą wersję ręcznie, i już nie wycieka z pamięci.

Dla każdego, kto to czyta, jeśli twój program openCV jest ciekawie przeciekający pamięci i zainstalowałeś go za pomocą MacPorts, sugerowałbym pobranie źródła i budynku ręcznie za pomocą cmake.

-1
  1. próbujesz uzyskać właściwości wychwytywania kamery przed wywołaniem cvQueryFrame i zależnie od okoliczności, które nie mogą spowodować uzyskanie poprawnych właściwości. nie wygląda, że ​​jest problem, tylko FYI:

  2. Nie ma powodu, aby tworzyć nowe IplImage. Jeśli wszystko, co próbujesz zrobić, to wyświetlić go w oknie, rozważ zmianę kodu przechwytywania.

New Przechwytywanie Loop:

while (true) { 

    frame = cvQueryFrame(fc); 

    if (!frame) 
     break; 

    cvShowImage("1", frame); 

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

} 

Jak pan wspomniał w swojej edycji, problem wynika cvShowImage następuje natychmiast przez cvReleaseImage, chyba że masz powód by to zrobić, po prostu usuń go.

+1

To oczywiście nie wszystko, co próbowałem zrobić. Mój fragment kodu miał pokazać, że nawet w bardzo podstawowej sytuacji występuje przeciek pamięci. Więc tak, jest powód, aby to zrobić, a mianowicie, że powinieneś skopiować dane obrazu do nowego IplImage przed wykonaniem operacji na nim. – wallacer

+0

Po prostu staram się pomóc człowiekowi, jeśli nie chcesz sugestii, nie zadawaj pytania. – tbridge

+0

was nie płonęła, tylko wskazywałam, że rzeczywiście istnieje powód do kopiowania obrazu. thx za odpowiedź – wallacer

Powiązane problemy