Утечки памяти при получении субизображений из видео (cvGetSubRect) - PullRequest
1 голос
/ 31 мая 2010

я пытаюсь сделать видео-окон:

показывает все кадры из видео, а также некоторые изображения из каждого кадра. Это вспомогательное изображение может изменить размер и быть взятым из другого положения исходного кадра.

Итак, код, который я написал, делает в основном это:

  1. cvQueryFrame , чтобы получить новое изображение из видео
  2. Создание нового IplImage (img) с размерами подизображения (window.height, window.width)
  3. Создание нового Cvmat (мат) с размерами подизображения (window.height, window.width)
  4. CvGetSubRect (originalImage, mat, window) захватывает фрагмент изображения
  5. преобразовать Mat (cvMat) в img (IplImage), используя cvGetImage

моя проблема в том, что для каждого кадра я создаю новые IplImage и cvMat, которые занимают много памяти, и когда я пытаюсь освободить выделенную память, я получаю ошибку сегментации, или в случае CvMat выделенное пространство не освобождается (Вальгринд продолжает говорить мне, что он определенно потерял место).

следующий код делает это:

int 
main(void){

    CvCapture* capture;

    CvRect window;
    CvMat * tmp;

    //window size
    window.x=0;window.y=0;window.height=100;window.width=100;

    IplImage * src=NULL,*bk=NULL,* sub=NULL;

    capture=cvCreateFileCapture( "somevideo.wmv");

    while((src=cvQueryFrame(capture))!=NULL){
        cvShowImage("common",src);

        //get sub-image
        sub=cvCreateImage(cvSize(window.height,window.width),8,3);
        tmp =cvCreateMat(window.height, window.width,CV_8UC1);
        cvGetSubRect(src, tmp , window);
        sub=cvGetImage(tmp, sub);

        cvShowImage("Window",sub);

        //free space
        if(bk!=NULL)
            cvReleaseImage(&bk);
        bk=sub;

        cvReleaseMat(&tmp);
        cvWaitKey(20);

        //window dimensions changes
        window.width++;
        window.height++;
    }
}

cvReleaseMat (& TMP) ; кажется, не влияет на общее количество потерянной памяти, valgrind сообщает о том же количестве «точно потерянной» памяти, если я комментирую или раскомментирую эту строку.

cvReleaseImage (& bk); вызывает ошибку сегментации. обратите внимание, я пытаюсь освободить предыдущий субкадр, который я копирую в переменную bk. Если я прокомментирую эту строку, программа будет работать гладко, но с большим количеством утечек памяти

Я использую Ubuntu 9.10 с OpenCV 2.0.

Мне действительно нужно избавиться от утечек памяти, Может ли кто-нибудь объяснить мне, как исправить это или даже лучше, как правильно выполнять оконные изображения?

Спасибо

1 Ответ

1 голос
/ 16 июля 2010

Кто-то сообщает о той же проблеме, что и ошибка в библиотеке. http://sourceforge.net/tracker/index.php?func=detail&aid=3025393&group_id=22870&atid=376677

Я решил это, используя ROI на изображении вместо cvGetSubRect, таким образом вы избежите выделения другого мата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...