2012-05-23 39 views
5

Bu kod, son satıra kadar iyi çalışıyor. Diskte doğru görüntüyü kaydeder ancak işlevden çıktıktan sonra bir "bellek sızıntısı" gösterir - yığın bozulması. Mat'ın açıkça serbest bırakılması gerekmediğini okudum. Benim durumumda, hem serbest bırakma hem de serbest bırakma ile çöküyor. Lütfen yardım et. Sana sadece biraz destek verebilir bu küçük bilgi ama gerçek çözümü ileyığın bozulması hatası; cv yayınlayamıyorum :: Mat opencv

void CannyEdgeDetectionFilter::applyFilter(Mat& mat, Mat& mixedBandsMat) 
{ 
    //Mat mixedBandsMat; 

    vector<Mat> bandWiseImages; 
    split(mat, bandWiseImages); 

    //! Evaluate numChannels to be filtered in the input image 
    int numChannels = mat.channels(); 
    int type = mat.type(); 

    //! Multiplied by 8 to get bits from Bytes 
    int singleChannelDepth = 8*mat.elemSize1(); 

    for (int i = 0; i < numChannels; i++) 
    { 
     Canny(bandWiseImages[i], bandWiseImages[i], m_LowerThreshold, 
      m_UpperThreshold, m_Kernel.rows); 
    } 

    //! Creating filteredImgMat in order to set DataValues 
    mixedBandsMat.create(mat.rows, mat.cols, mat.type()); 

    //! Unifying the channels back to the output image 
    merge(bandWiseImages, mixedBandsMat); 
#if 1 
    //Release bandWiseImages Mat memory 
    int bandWiseVecSize = bandWiseImages.size(); 
    for(int i = 0; i < bandWiseVecSize; i++) 
     bandWiseImages[i].release(); 
    bandWiseImages.clear(); 
    //fromTo.clear(); 
#endif 
    imwrite("D:\\testAfterCannyEdgeDetetionFilter.jpg", mixedBandsMat); 
    mixedBandsMat.release(); 
} 
+0

Yığın yolsuzluğunu nasıl tespit edersiniz, bunun için hangi programı kullanıyorsunuz? sadece merak ediyor ... – penelope

+0

Bellek sızıntısı mı gösteriyor, yoksa çöküyor mu? – juanchopanza

+0

Görsel stüdyo 2008 üzerinde çalışıyorum. İşlevden çıkarken kod çöküyor. – user1412066

cevap

1

:

1.) Sana Win7 kullandığınızı sanırım. Bu yüzden lütfen visit Dr. Memory ve kurun (sistem değişkenlerine eklenen yol ile). Daha sonra, aşağıdaki komutu kullanarak uygulamayı başlatabilirsiniz: drmemory.exe -no_follow_children C:\\the_path\\YourExecutable.exe argv[1] ... argv[n]. -no_follow_children diğer üçüncü taraf kodlarını yok saymak için kullanılır. Bu komutu çalıştırın. Dr. Memory, sonucu C:\Users\NAMEHERE\AppData\Roaming\Dr. Memory\'a yazacaktır. Bir bak, belki şimdi bir ipucu var. Değilse -> buraya gönderin. =)

2.) Sıkıştırma parametresi olmayan bir görüntüyü yazarken OpenCV bazen çökebilir. ++ Ben C STL vektör [i] .release üye işlev bulamadık

vector<int> crparam; 
crparam.push_back(CV_IMWRITE_PNG_COMPRESSION); 
cv::imwrite("D:\\testAfterCannyEdgeDetetionFilter.png", mixedBandsMat, crparam); 
+1

3.) NO işaretçiler, HAYIR HAYIR! (bu şekilde dahili refcount'ları atlatacaksınız). Orada zaten yeterince yolsuzluk sorunu var – berak

+0

Tamam - Belki de şimdilik çok fazla. –

+0

Çocuklar, görüntüyü düzelttiğimde (ince) ve ardından çıkmak için Boşluk düğmesine basıldığında (hemen ardından) çarpışma gerçekleşir. Aynı proje aynı zamanda 1 hafta önce doğru bir şekilde çalışıyor, ancak şimdi basitçe çöküyor (aynı dosya yedekleme). Bilgisayar yüzünden mi? Şimdi 8. kazananı kullanıyorum. –

-2

: Ben o yüzden hep imwrite-fonksiyona int-parametrelerin bir vektör vermek bu biraz zaman yaşadım. Vektörü deneyin [i] .erase

+0

hepsi burada serbest kalan Mats var, vektör değil – berak