2010-11-16 24 views
5

'da basit video akışında bellek sızıntısı Sadece en basit video akışını yapmak bile benim için bir bellek sızıntısına neden oluyor. Anlaşılan kitabında "Öğrenme OpenCV" göre OpenCV 2.1 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); 
} 

, bunu "Ben yaparsam sorunları bekliyoruz" olabilir OpenCV ve I tarafından yönetilen bu yana "çerçeve" serbest bırakmak için yasak. CvQueryFrame çağrıldığında çerçeve işaretçisini serbest bıraksam gerçekten sorunlara neden olur. Kitap aynı zamanda cvQueryFrame'in başka bir yerde çalışması için cvQueryFrame tarafından işaret edilen görüntünün kopyalanmasını önerir çünkü cvQueryFrame muhtemelen aynı bellek yığınının tekrar tekrar tekrar geri dönmesini sağlar. Bu nedenle her çerçeve döngüsünün sonunda serbest bıraktığım wrkImage. Program birkaç dakika sonra çöküyor ve çılgınlık gibi hafıza sızıntısı! Tüm çerçeveler gibi büyük bir şeyin sızan olduğuna inanıyorum. Birisi video için Mac’te OpenCV 2.1’i kullanıp kullanmadığımı merak ediyorum ve bunun bir sorun olduğunu da fark ettim. Ya da benim kodumda eksik olduğum bir boşluk görebilir.

OpenCV guru'larının önerileri, çok takdir edilecektir!

Düzenleme: Programa dikkatlice adım attıktan ve belleği inceledikten sonra, sorunun cvShowImage() ile olduğundan şüpheleniyorum. cvShowImage, bir çerçevenin geri kazanılmış gibi görünmeyen bir bellek değerine tahsis ediyor gibi görünüyor. Sonra şüphelerime katılıyormuş gibi görünen bu bağlantıyı OpenCV cvShowImage Memory Leaks OSX buldum. Burada bir çözüme yakın olabilir ... Sadece deli olmadığımı gördüğüme sevindim!

GÜNCELLEME: Macports OpenCV şu anda gayet iyi (ve birkaç aydır var. Sadece burada yayınlamam gerektiğini düşündüğüm için insanlar MacCalls'ı OpenCV build/install'ları için kullanmama konusunda cesaret kırmıyorlar. OpenCV yüklemek için bir yol.

+0

Oh ve OpenCV 2.1'in Mac Port'lar yüklemesini kullanıyorum 2 hafta önce yükledim – wallacer

cevap

0

Sağladığım kodda bir sorun yok. Geçerli MacPorts openCV yapısı, cvShowImage() işlevinde bir bellek sızıntısına sahiptir. En son sürümü manuel olarak indirip kurdum ve artık belleği sızdırmıyor.

Bunu okuyan herkes için, openCV programınız meraklı bir şekilde bellek sızdırıyorsa ve MacPorts kullanarak yüklüyse, kaynak indirmeyi ve cmake kullanarak el ile oluşturmanızı öneririz.

-1
  1. kameranın yakalama özelliklerini almak için çalışıyoruz cvQueryFrame arayarak ve doğru özelliklere almakla sonuçlanmayabilir koşullara bağlı önce. böyle görünmüyor, konudur sadece FYI

  2. Yeni biroluşturmak için bir sebep yok.. Tüm yapmaya çalıştığınız şey bir pencerede görüntülüyse, yakalama kodunuzu değiştirmeyi düşünün.

Yeni Yakalama Döngü: Bunu yapmak için bir nedeni sahip olmadığımız takdirde DÜZENLEME belirtilen gibi

while (true) { 

    frame = cvQueryFrame(fc); 

    if (!frame) 
     break; 

    cvShowImage("1", frame); 

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

} 

, sorun kaynaklanıyor cvShowImage, cvReleaseImage, hemen ardından sadece çıkarın.

+1

Açıkçası bu, yapmaya çalıştığım tek şey değil. Benim kod parçacığım, son derece basit bir durumda bile, bir bellek sızıntısı olduğunu göstermek için vardı. Evet, bunu yapmak için bir neden var, yani görüntü verilerini, üzerinde işlem yapmadan önce yeni bir IplImage'a kopyalamanız gerekiyor. – wallacer

+0

Sadece erkeğe yardım etmeye çalışıyorum, eğer önerilerinizi istemiyorsanız bir soru sormayın. – tbridge

+0

, sadece görüntüyü kopyalamanın bir sebebi olduğuna işaret ederek sizi alevlendirmiyordu. cevap için thx – wallacer