2010-11-16 16 views
5

Incluso el simple hecho de la transmisión de video más básica provoca una pérdida de memoria.OpenCV 2.1 Fuga de memoria en la transmisión de video simple en Mac OSX

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); 
} 

Al parecer, según el libro "Learning OpenCV", supone que no puedo liberar "marco", ya que está gestionado por OPENCV y puedo "esperar problemas si lo hago". Ciertamente causa problemas si lanzo el puntero de marco una vez que he llamado a cvQueryFrame. El libro también sugiere copiar la imagen apuntada por cvQueryFrame en otro lugar para trabajar en ella, ya que cvQueryFrame presumiblemente recicla el mismo fragmento de memoria repetidamente. De ahí que wrkImage lo libere al final de cada ciclo de cuadro. ¡El programa falla después de unos minutos, y pierde la memoria como una locura! Me lleva a creer que algo importante se está filtrando como marcos enteros. Me pregunto si alguien usa OpenCV 2.1 en Mac para material de video y también ha descubierto que esto es un problema. O si alguien puede ver un agujero en mi código que me falta.

¡Se agradecerán todos los consejos de OpenCV guru!

Editar: Después de pasar cuidadosamente por el programa y examinar la memoria, sospecho que el problema es con cvShowImage(). cvShowImage parece asignar aproximadamente una memoria de marco que nunca parece recuperarse. Luego encontré este enlace OpenCV cvShowImage Memory Leaks OSX que parece estar de acuerdo con mis sospechas. Podría estar cerca de una solución aquí ... ¡Me alegra ver que no estoy loco!

ACTUALIZACIÓN: El OpenCV de Macports está bien ahora (y lo ha sido durante unos meses. Solo pensé que debería publicarlo aquí para que la gente no se desanime de usar macports para su compilación/instalación de OpenCV. Macports es un gran manera de instalar OpenCV.

+0

Oh y estoy usando una instalación de Mac Ports de OpenCV 2.1 que instalé hace 2 semanas – wallacer

Respuesta

0

No hay nada malo con el código que proporcioné. La compilación actual de MacPorts de openCV tiene una pérdida de memoria en la función cvShowImage(). Descargué y construí la versión más reciente de forma manual, y ya no gotea la memoria.

Para cualquiera que lea esto, si su programa openCV tiene una pérdida de memoria curiosamente, e instaló usando MacPorts, le sugiero que descargue la fuente y la construcción manualmente usando cmake.

-1
  1. Usted está tratando de obtener las propiedades de captura de la cámara antes de llamar cvQueryFrame y dependiendo de las circunstancias que pueden no resultar en conseguir las propiedades correctas. no parece que sea el tema, solo FYI.

  2. No hay ninguna razón para crear un nuevo IplImage. Si todo lo que intenta hacer es mostrarlo en una ventana, considere cambiar su código de captura.

nuevo bucle de captura:

while (true) { 

    frame = cvQueryFrame(fc); 

    if (!frame) 
     break; 

    cvShowImage("1", frame); 

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

} 

Al igual que usted ha mencionado en su edición, el problema se deriva cvShowImage seguido inmediatamente por cvReleaseImage, a menos que tenga una razón por hacerlo, simplemente eliminarlo.

+1

Esto obviamente no es todo lo que estaba tratando de hacer. Mi fragmento de código debía mostrar que incluso en una situación extremadamente básica, hay una pérdida de memoria. Entonces, sí, hay una razón para hacerlo, es decir, que se supone que debes copiar los datos de imagen en una nueva IplImage antes de realizar operaciones en ella. – wallacer

+0

Solo estoy tratando de ayudar al hombre, si no quiere sugerencias, entonces no haga una pregunta. – tbridge

+0

no lo llamó la atención, solo señaló que, de hecho, hay una razón para copiar la imagen. thx para la respuesta – wallacer

Cuestiones relacionadas