2013-08-18 3 views
0

Я использую следующий код:Программы падает на использование grabCut в OpenCV 2.3.1

#include <iostream> 

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/opencv.hpp> 

using namespace cv; 
using namespace std; 

    int main(int argc, char* argv[]) 
    { 
     const string ipImgName= argv[1]; 
     Mat ipImg; 
     ipImg = imread(ipImgName, 1); 

     cv::Mat gcImg; 
     cv::Mat bgdModel; 
     cv::Mat fgdModel; 
     cv::Rect rect(0, 0, ipImg.cols-1, ipImg.rows-1); 
     cv::grabCut(ipImg, gcImg, rect, bgdModel, fgdModel, 1, cv::GC_INIT_WITH_RECT); 


     return 0; 
    } 

Но при выходе из основного цикла, когда отладчик переходит в ~Mat() деструктор, то код авария на release() (говорит «возможно, из-за повреждения кучи») для gcImg или bgdModel или fgdModel.

Однако, если я размещаю cv::Mat s на куче, используя new, а затем не удаляйте их после, код работает нормально. Я использую Visual Studio 2010 с OpenCV 2.3.1.

ответ

0

Если вы используете сборку Debug, связанную с релизными библиотеками, вы можете указать этой ложной «ошибкой» из-за использования различных подпрограмм распределения памяти.

В сборках отладки выделение памяти защищено защитными байтами на каждом конце выделенных блоков, а различные проверки выполняются для повреждения, утечки и т. Д. В версиях Release эти проверки не выполняются, и когда вы смешиваете код Debug и Release, так что что выделенная память одна освобождается вместе с другой, это типично для ошибки, которую вы видите.

Это не настоящая ошибка, а лишь побочный эффект смешивания разных режимов работы. MSDN has more details.