2016-03-21 114 views
3

我需要檢測對象的圖像輪廓。爲此,我使用OpenCV庫的功能findContours。我在編輯的Windows 10 (x64)上使用OpenCV 3.0 (x86)OpenCV 3.0 findContours崩潰

問題

的問題是,當我嘗試使用此功能,應用程序崩潰。該錯誤是不是異常或斷言失敗,我只能看到一個窗口,對我說該應用程序已崩潰:

enter image description here

我已經測試

我已經檢查了我的形象「M傳遞到findContours是二值圖像:

我已經檢查了圖像,該圖像是0,同爲CV_8U值的類型。

我甚至查直方圖,並有只值0和1

像素我也搜索了從OpenCV的教程和論壇的例子,我試圖做同樣的比例如,程序又崩潰了。

代碼

下面是我執行的代碼:

// 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的Debug配置和OpenCV的發佈庫(* .libs,它們沒有'd')。我已經使用Release配置測試了該程序並且它可以正常工作。我甚至畫出了檢測到的輪廓,功能正常。

+2

您必須小心,不要在發行版(或混合編譯器版本)中的調試應用程序或調試dll中使用發行版dll。其中任何一種情況都會導致您有超過1個不兼容的堆,這會在嘗試從另一個堆釋放分配的內存時導致堆損壞。堆損壞並不總是會導致即時崩潰,因此可能難以確定原因。 – drescherjm