代码之家  ›  专栏  ›  技术社区  ›  dnul

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

  •  1
  • dnul  · 技术社区  · 15 年前

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

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

    1. cvQueryFrame公司
    2. 创建新的 限制 (img)具有子图像尺寸(窗口.高度,窗口.宽度)
    3. 创建新的 Cvmat公司 (mat)具有子图像尺寸(窗.高,窗.宽)
    4. 使用将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(&黑色);

    我使用的是带有opencv2.0的ubuntu9.10。

    有谁能告诉我如何纠正这个问题,或者更好地解释如何正确地执行图像窗口?

    谢谢你

    1 回复  |  直到 15 年前
        1
  •  1
  •   dnul    14 年前

    http://sourceforge.net/tracker/index.php?func=detail&aid=3025393&group_id=22870&atid=376677

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