Даже простейшая потоковая передача видео вызывает у меня утечку памяти.
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.