2012-05-23 12 views
5

Questo codice funziona bene fino all'ultima riga. Salva l'immagine corretta sul disco ma mostra una "perdita di memoria" dopo l'uscita dalla funzione - danneggiamento dell'heap. Avevo letto che Mat non ha bisogno di essere rilasciato esplicitamente. Nel mio caso, si blocca sia con il rilascio che senza il rilascio. Per favore aiuto.errore di danneggiamento dell'heap; impossibile rilasciare cv :: 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

come si rileva il danneggiamento dell'heap, quale programma si sta utilizzando per quello? mi stavo solo chiedendo ... – penelope

+0

Mostra una perdita di memoria o si blocca? – juanchopanza

+0

Sto lavorando su Visual Studio 2008. Il codice si arresta in modo anomalo all'uscita dalla funzione. – user1412066

risposta

1

Con questo poche informazioni posso solo dare un certo sostegno ma nessuna vera soluzione:

1.) Immagino che si sta utilizzando Win7. Quindi per favore visit Dr. Memory e installalo (con percorso aggiunto alle variabili di sistema). Quindi è possibile avviare l'applicazione utilizzando il seguente comando: drmemory.exe -no_follow_children C:\\the_path\\YourExecutable.exe argv[1] ... argv[n]. Il -no_follow_children viene utilizzato per ignorare altri codici di terze parti. Esegui questo comando. Dr. Memory scriverà il risultato fino a C:\Users\NAMEHERE\AppData\Roaming\Dr. Memory\. Dai un'occhiata, forse ora hai un suggerimento. In caso contrario -> pubblicalo qui. =)

2.) A volte OpenCV si blocca quando si scrive un'immagine senza parametro di compressione. Ho sperimentato questo po 'di tempo così ho sempre dare un vettore di int-parametri alla imwrite funzione:

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

3.) NO puntatori, NO NO NO! (staresti battendo i consigli interni in questo modo). il ragazzo ha già abbastanza problemi di corruzione – berak

+0

Ok - Forse per molto per ora. –

+0

Ragazzi, l'incidente si verifica quando visualizzo l'immagine (fine) e quindi premiamo Spazio per uscire (immediatamente dopo). Anche lo stesso progetto viene eseguito correttamente in precedenza 1 settimana fa, ma ora si blocca semplicemente (stesso file dal backup). È dovuto al computer? Sto usando Wins 8 ora. –

-2

non riuscivo a trovare vettore [i] funzione membro .Rilasciare in STL per C++. Prova vettoriale [i] .erase

+0

è tutto Mats che viene rilasciato lì, non vettoriale – berak