Утечка памяти в OpenCV 2.1 при простой потоковой передаче видео на Mac OSX - PullRequest
5 голосов
/ 17 ноября 2010

Даже простейшая потоковая передача видео вызывает у меня утечку памяти.

cvNamedWindow("1",0);
CvCapture *fc = cvCaptureFromCAM(0);
IplImage *frame = NULL;
CvSize frameSize;
frameSize.height = cvGetCaptureProperty(fc, CV_CAP_PROP_FRAME_HEIGHT);
frameSize.width = cvGetCaptureProperty(fc, CV_CAP_PROP_FRAME_WIDTH);

while (1) { 
    IplImage *wrkImage = NULL;

    frame = cvQueryFrame(fc);

    if (!frame) 
        break;

    wrkImage = cvCreateImage(frameSize, IPL_DEPTH_8U, 3);
    cvCopy(frame, wrkImage, NULL);

    cvShowImage("1", wrkImage);

    char c = cvWaitKey(33);
    if (c == 27) {
        break;
    }

    cvReleaseImage(&wrkImage);
}

Очевидно, согласно книге "Изучение OpenCV", я не должен выпускать "фрейм", поскольку он управляется openCV, и я могу "ожидать проблем, если я это сделаю". Это действительно вызывает проблемы, если я освобождаю указатель кадра, как только я вызвал cvQueryFrame. В книге также предлагается скопировать изображение, на которое указывает cvQueryFrame, для работы с ним, поскольку cvQueryFrame, вероятно, многократно перерабатывает один и тот же кусок памяти. Следовательно wrkImage, который я действительно выпускаю в конце каждого цикла кадра. Программа вылетает через несколько минут и теряет память как сумасшедшая! Заставляет меня верить, что что-то главное пропускает как целые кадры. Мне интересно, если кто-нибудь использует OpenCV 2.1 на Mac для видео и считает, что это также является проблемой. Или если кто-то может увидеть зияющую дыру в моем коде, которую я пропускаю.

Любой совет от гуру OpenCV был бы очень признателен!

Редактировать: После тщательного изучения программы и проверки памяти, я подозреваю, что проблема связана с cvShowImage (). Похоже, что cvShowImage распределяет объем памяти фрейма, который никогда не восстанавливается. Потом нашел эту ссылку OpenCV cvShowImage Утечки памяти OSX , которая, похоже, согласуется с моими подозрениями. Может быть, здесь есть решение ... Просто рад видеть, что я не сумасшедший!

ОБНОВЛЕНИЕ: Macports OpenCV теперь в порядке (и уже несколько месяцев. Просто подумал, что я должен опубликовать это здесь, чтобы люди не отчаивались от использования macports для их сборки / установки OpenCV. Macports - отличный способ установить OpenCV.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2010

Нет ничего плохого в коде, который я предоставил.Текущая сборка MacPorts openCV имеет утечку памяти в функции cvShowImage ().Я скачал и собрал самую последнюю версию вручную, и она больше не вызывает утечку памяти.

Для тех, кто читает это, если ваша программа openCV излишне протекает из памяти, и вы установили с помощью MacPorts, я бы предложил загрузитьисточник и сборка вручную с помощью cmake.

0 голосов
/ 22 ноября 2010
  1. Вы пытаетесь получить свойства захвата камеры перед вызовом cvQueryFrame и в зависимости от обстоятельств, которые могут не привести к получению правильных свойств.Не похоже, что это проблема, просто к вашему сведению.

  2. Нет причин создавать новый IplImage.Если все, что вы пытаетесь сделать, - это отобразить его в окне, подумайте об изменении кода захвата.

Новый цикл захвата:

while (true) { 

    frame = cvQueryFrame(fc);

    if (!frame) 
        break;

    cvShowImage("1", frame);

    char c = cvWaitKey(33);
    if (c == 27) {
        break;
    }

}

Как вы упомянули в своемРЕДАКТИРОВАТЬ, проблема связана с cvShowImage, за которым сразу следует cvReleaseImage, если только у вас нет причины для этого, просто удалите ее.

...