2016-03-21 27 views
3

Nesnenin bir görüntü konturu algılamam gerekiyor. Bu amaçla OpenCV kütüphanesinin findContours işlevini kullanıyorum. Ben contrib modules ile bana tarafındankullanarak Windows 10 (x64) kullanıyorum.OpenCV 3.0 findContours çöküyor

sorun

sorundur ben bu işlevi, uygulama çöker kullanmaya çalıştığınızda, o. Hata yalnızca bir pencere uygulaması çöktü bana söyleyerek görebilirsiniz bir istisna ya da onaylama işlemi hatası değildir:

Ben

test ettik ne

enter image description here

kontrol ettim o görüntü I findContours 'a geçme ikili bir resimdir:

CV_8U değeriyle aynı olan resim türünü kontrol ettim.

Hatta histogramı kontrol ettik ve orada ben de OpenCV öğreticiler ve forumlardan örnekler aramış değerler 0 ile 1

ile sadece piksel, ve ben daha tam olarak aynı şeyi yapmaya çalıştık

örnek ve program yine çöküyor.

// This is the main function: 
int test_findContours(const std::string &path){ 
    Mat img = imread(path, IMREAD_GRAYSCALE); 
    if (!img.data){ 
     cout << "ERROR" << endl; 
     return -1; 
    } 
    Mat mask; 
    getRemBackgroundMask(img, mask); 

    vector< vector<Point> > contours; 

    // Here the program crashes: 
    findContours(mask, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); 
    return 0; 
} 

// Get the mask to remove the background 
void getRemBackgroundMask(const Mat &img, Mat &mask) { 
    threshold(img, mask, 70, 1, THRESH_BINARY_INV); 

    Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); 
    openning(mask, mask, kernel); 
} 

void openning(const Mat &binary, Mat &result, const Mat &kernel){ 
    erode(binary, result, kernel); 
    dilate(binary, result, kernel); 
} 

cevap

4

Sorun bulduk:

kod İşte

ben yürütme ediyorum koddur. Söz konusu hata, Visual Studio 2013'ün OpenCV's Release kitaplıkları ('d' olmayan * .libs) ile Debug yapılandırmasını kullandığım için ortaya çıkar. Programı Release konfigürasyonu ile test ettim ve işe yarıyor. Algılanan konturları bile çizdim ve işlev tamam.

+2

Sürümdeki Debug uygulamalarında veya Debug dms'deki Release dlls'i (veya derleyicinin sürümlerini karıştırırken) kullanmamaya dikkat edin. Bunlardan herhangi biri, biri diğerinden ayrılmış belleği boşaltmaya çalışırken yığın bozulmasına neden olan 1'den fazla uyumsuz yığına sahip olmanıza neden olur. Yığın bozulması her zaman bir ani çökmeye neden olmaz, bu nedenle nedenini belirlemek zor olabilir. – drescherjm