释放OpenCV::VideoCapture的内存(或正确使用cvRelease)

Release memory of OpenCV::VideoCapture (or using cvRelease correctly)

本文关键字:cvRelease VideoCapture OpenCV 内存 释放      更新时间:2023-10-16

我正在做这个例子。我遇到的问题是应用程序的内存消耗,它从180 mb左右开始,在30秒内达到1.5 gb。

void VideoCaptureCV::update()
{
    cap >> frame; // cap is cv::VideoCapture
    if(_img == 0)
    {
        _img = new CvMat(frame);
    }
    CvArr *arr = _img;
    CvMat *arrMat, *cvimage, stub;
    arrMat = cvGetMat(arr, &stub);
    cvimage = cvCreateMat(arrMat->rows, arrMat->cols, CV_8UC3);
    cvConvertImage(arrMat, cvimage, 0);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, tex_uid);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, cvimage->cols, cvimage->rows,0, GL_BGR, GL_UNSIGNED_BYTE, cvimage->data.ptr);
    glBindTexture(GL_TEXTURE_2D, 0);
    glDisable(GL_TEXTURE_2D);
    w = cvimage->cols;
    h = cvimage->rows;
    // non of the following works correctly, it sends
    // exception: cv::Exception at memory location
    //cvRelease(&arr);
    //cvReleaseMat(&arrMat);
    //cvReleaseMat(&cvimage);
    //cvReleaseMat(&stub);
}

你知道如何正确使用cvRelease吗?

编辑1:添加了使用cvRelease 时的错误发送

 if(_img == 0)
    {
        _img = new CvMat(frame);
    }
    CvArr *arr = _img;

这是怎么编译的?

您不需要用openCV映像调用new,它们将为您处理内存管理,只需在堆栈上本地创建映像,并让openCV清理