2016-03-21 31 views
3

イメージのオブジェクトの輪郭を検出する必要があります。その目的のために、私はOpenCVライブラリの関数findContoursを使用しています。私はで私が編集したをWindows 10 (x64)に使っています。OpenCV 3.0 findContoursがクラッシュする

問題

は、問題は、私は、この機能、アプリケーションのクラッシュを使用しようとすると、ということです。エラーは、私が唯一のウィンドウは、アプリケーションがクラッシュしたことを私に言って見ることができ、例外またはアサーションの失敗ではありません。

私は

をテストしている何

enter image description here

私がチェックしたその画像I findContoursに渡された画像は、バイナリ画像です:

CV_8Uと同じ0の画像のタイプを確認しました。

私もOpenCVのチュートリアルやフォーラムからの例で検索しました、と私はより正確に同じことをしようとしている私も、ヒストグラムをチェックして、値0と1

を持つピクセルのみがあります例では、プログラムが再びクラッシュします。

コードここ

は、私が実行していたコードです:

// 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); 
} 

答えて

4

私は問題を発見しました。上記のエラーは、Visual Studio 2013のデバッグ構成をOpenCVのリリースライブラリ(* .libsに 'd'が付いていないもの)で使用していたために発生します。私はリリース構成でプログラムをテストし、それが動作します。私は検出された輪郭線を描画し、機能は正常に動作します。

+2

リリースではリリースDLLを使用しないでください。また、リリースではDLLを使用しないでください(またはコンパイラのバージョンを混在させる)。いずれの場合も、1つ以上の互換性のないヒープがあり、割り当てられたメモリを他のメモリから解放しようとするとヒープの破損が発生します。ヒープの破損は必ずしも即時のクラッシュを引き起こすとは限りません。その理由を特定するのは難しいかもしれません。 – drescherjm