2012-05-23 2 views
5

Этот код отлично работает до последней строки. Он сохраняет правильное изображение на диске, но при выходе из функции происходит «утечка памяти» - повреждение кучи. Я читал, что Mat не должен быть явно выпущен. В моем случае он сбрасывается как с выпуском, так и без освобождения. Пожалуйста помоги.ошибка повреждения кучи; не удалось выпустить 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

как вы обнаруживаете кучевое повреждение, какую программу вы используете для этого? просто интересно ... – penelope

+0

Это показывает утечку памяти, или это сбой? – juanchopanza

+0

Я работаю над визуальной студией 2008. Код выходит из строя при выходе из функции. – user1412066

ответ

1

С помощью этой небольшой информации, которую я могу дать вам только некоторую поддержку, но не реальное решение:

1.) Я предполагаю, что вы используете Win7. Поэтому, пожалуйста, visit Dr. Memory и установите его (с путём, добавленным к системным переменным). Затем вы можете запустить приложение с помощью следующей команды: drmemory.exe -no_follow_children C:\\the_path\\YourExecutable.exe argv[1] ... argv[n]. -no_follow_children используется для игнорирования другого стороннего кода. Запустите эту команду. Dr. Memory напишет результат до C:\Users\NAMEHERE\AppData\Roaming\Dr. Memory\. Посмотрите, возможно, у вас есть намек. Если нет -> разместите его здесь. =)

2.) Иногда OpenCV может возникнуть при записи изображения без параметра сжатия. Я испытал это некоторое время, так что я всегда даю вектор INT-параметров для imwrite-функции:

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

3.) НЕТ указателей, НЕТ НЕТ НЕТ! (таким образом, вы будете обманывать внутренние refcounts). У парня там уже достаточно проблем с коррупцией – berak

+0

Хорошо - Возможно, сейчас много. –

+0

Ребята, авария происходит, когда я diplay изображение (штраф), а затем нажмите пробел, чтобы выйти (сразу после этого). Также тот же проект работает правильно ранее 1 неделю назад, но теперь он просто сбой (тот же файл из резервной копии). Это связано с компьютером? Сейчас я использую Wins 8. –

-2

Я не мог найти вектор [I] .release функции члена в STL для C++. Попробуйте вектор [i] .erase

+0

это все маты, которые выпущены там, а не вектор – berak

Смежные вопросы