Memory leaks getting sub-images from video (cvGetSubRect)
- by dnul
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:
cvQueryFrame to get a new image from the video
Create a new IplImage (img) with sub-image dimensions ( window.height,window.width)
Create a new Cvmat (mat) with sub-image dimensions ( window.height,window.width)
CvGetSubRect(originalImage,mat,window) seizes the sub-image
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 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