【问题标题】:Release memory of OpenCV::VideoCapture (or using cvRelease correctly)释放 OpenCV::VideoCapture 的内存(或正确使用 cvRelease)
【发布时间】:2012-02-20 20:49:38
【问题描述】:

我正在做this example。我遇到的问题是应用程序的内存消耗,它从大约 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时的错误发送

【问题讨论】:

  • “以下非正常工作,它发送”...什么?
  • 如果arr是用new分配的,你真的可以调用cvRelease(&arr)吗?你不应该调用 delete _arr (or _img) 吗?
  • 尝试删除 arr;同样的问题,异常: cv::Exception at memory location
  • 简单的答案:不要将 C 与 C++ 混合使用,也不要将 C++ 接口用于图像,而不仅仅是用于视频捕获。
  • 感谢我尝试过并且工作得更好

标签: c++ opencv opengl memory-management


【解决方案1】:
 if(_img == 0)
    {
        _img = new CvMat(frame);
    }

    CvArr *arr = _img;

这甚至是如何编译的?

您不需要使用 openCV 图像调用 new,他们会为您处理 memory management,只需在堆栈上本地创建图像并让 openCV 清理

【讨论】:

    猜你喜欢
    • 2017-07-06
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2023-03-11
    • 2014-06-20
    • 2020-11-28
    相关资源
    最近更新 更多