2012-05-23 17 views
5

Este código funciona bien hasta la última línea. Guarda la imagen correcta en el disco, pero muestra una "pérdida de memoria" después de salir de la función: corrupción de pila. Había leído que Mat no necesita ser lanzado explícitamente. En mi caso, se bloquea tanto con liberación como sin liberación. Por favor ayuda.error de corrupción de montón; no se puede liberar 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

cómo detecta la corrupción del montón, ¿qué programa está utilizando para eso? solo me preguntaba ... – penelope

+0

¿Muestra una pérdida de memoria o se cuelga? – juanchopanza

+0

Estoy trabajando en Visual Studio 2008. El código se bloquea al salir de la función. – user1412066

Respuesta

1

Con esta poca información que sólo se le puede dar algo de apoyo pero ninguna solución real:

1.) supongo que está utilizando Win7. Por lo tanto, por favor visit Dr. Memory e instálelo (con la ruta agregada a las variables del sistema). Luego puede iniciar su aplicación usando el siguiente comando: drmemory.exe -no_follow_children C:\\the_path\\YourExecutable.exe argv[1] ... argv[n]. El -no_follow_children se usa para ignorar otro código de terceros. Ejecuta este comando. El Dr. Memory escribirá el resultado en C:\Users\NAMEHERE\AppData\Roaming\Dr. Memory\. Eche un vistazo, tal vez ahora tenga una pista. Si no,> publícalo aquí. =)

2.) OpenCV a veces puede bloquearse cuando está escribiendo una imagen sin parámetro de compresión. He experimentado esto alguna vez, así que siempre doy un vector de parámetros int-al-imwrite función:

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

3.) SIN punteros, NO NO NO! (Estarías superando a los recuentos internos de esta manera). chico ya tiene suficientes problemas de corrupción – berak

+0

Ok - Tal vez mucho por ahora. –

+0

Chicos, el choque ocurre cuando reproduzco la imagen (bien) y luego presiono la barra espaciadora para salir (inmediatamente después de eso). También el mismo proyecto se ejecuta correctamente hace una semana, pero ahora simplemente se bloquea (el mismo archivo de la copia de seguridad). ¿Es por la computadora? Estoy usando Wins 8 ahora. –

-2

no pude encontrar el vector función miembro [i] .release en STL para C++. Pruebe el vector [i] .erase

+0

son todas las Mats que se lanzan allí, no vector – berak

Cuestiones relacionadas