内存泄漏从视频获取子图像(cvGetSubRect)

时间:2010-05-31 05:14:18

标签: c++ opencv

我正在尝试进行视频窗口:

显示视频中的所有帧以及每帧中的一些子图像。该子图像可以改变尺寸并从原始帧的不同位置拍摄。

所以,我写的代码基本上是这样的:

  1. cvQueryFrame 从视频中获取新图片
  2. 使用子图像尺寸(window.height,window.width)创建新的 IplImage (img)
  3. 使用子图像尺寸(window.height,window.width)创建新的 Cvmat (mat)
  4. CvGetSubRect (originalImage,mat,window)占用子图像
  5. 使用 cvGetImage
  6. 将Mat(cvMat)转换为img(IplImage)

    我的问题是,对于每个帧,我创建新的IplImage和cvMat,它占用大量内存,当我尝试释放分配的内存时,我得到分段错误,或者在CvMat的情况下,分配的空间不会自由(valgrind一直告诉我它绝对失去了空间)。

    以下代码执行此操作:

    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 个答案:

答案 0 :(得分:1)

有人报告了与库中的错误相同的问题。 http://sourceforge.net/tracker/index.php?func=detail&aid=3025393&group_id=22870&atid=376677

我通过在图像中使用ROI而不是cvGetSubRect来解决它,这样就可以避免分配另一个垫子。