Освободите память OpenCV :: VideoCapture (или используйте cvRelease правильно) - PullRequest
0 голосов
/ 21 февраля 2012

Я делаю этот пример . Проблема, которая у меня есть, заключается в потреблении памяти приложением, оно начинает работать со скоростью около 180 МБ и увеличивается до 1,5 ГБ за 30 секунд.

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

1 Ответ

1 голос
/ 21 февраля 2012
 if(_img == 0)
    {
        _img = new CvMat(frame);
    }

    CvArr *arr = _img;

Как это компилируется?

Вам не нужно вызывать new с изображениями openCV, они будут обрабатывать управление памятью для вас, просто создайте изображения локально в стеке и позвольте openCV очистить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...