tags:

views:

135

answers:

1

Hi, i'm trying to do video windowing that is:

show all frames from a video and also some sub-image from each frame. This sub-image can change size and be taken from a different position of the original frame.

So , the code i've written does basically this:

  1. cvQueryFrame to get a new image from the video
  2. Create a new IplImage (img) with sub-image dimensions ( window.height,window.width)
  3. Create a new Cvmat (mat) with sub-image dimensions ( window.height,window.width)
  4. CvGetSubRect(originalImage,mat,window) seizes the sub-image
  5. transform Mat (cvMat) to img (IplImage) using cvGetImage

my problem is that for each frame i create new IplImage and cvMat which take a lot of memory and when i try to free the allocated memory I get a segmentation fault or in the case of the CvMat the allocated space does not get free (valgrind keeps telling me its definetly lost space).

the following code does it:

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); does not seem to have any effect on the total amount of lost memory, valgrind reports the same amount of "definetly lost" memory if i comment or uncomment this line.

cvReleaseImage(&bk); produces a segmentation fault. notice i'm trying to free the previous sub-frame which i'm backing up in the bk variable. If i comment this line the program runs smoothly but with lots of memory leaks

i'm using ubuntu 9.10 with opencv 2.0 .

I really need to get rid of memory leaks, can anyone explain me how to correct this or even better how to correctly perform image windowing?

Thank you

A: 

Someone report the same problem as a bug in the library. http://sourceforge.net/tracker/index.php?func=detail&aid=3025393&group_id=22870&atid=376677

I solved it by using ROI in the image instead of cvGetSubRect, that way you avoid to alloc another mat.

dnul