2016-03-21 9 views
3

Ich muss die Kontur des Objekts eines Bildes erkennen. Zu diesem Zweck verwende ich die OpenCV-Bibliotheksfunktion findContours. Ich benutze OpenCV 3.0 (x86) auf Windows 10 (x64) zusammengestellt von mir mit der contrib modules.OpenCV 3.0 findContours stürzt

Das Problem

Das Problem ist, dass, wenn ich versuche, diese Funktion zu nutzen, die Anwendung abstürzt. Der Fehler ist nicht eine Ausnahme oder ein Assertionsfehler, kann ich nur ein Fenster öffnen, mir zu sagen, dass die Anwendung abgestürzt ist:

enter image description here

Was ich

getestet Ich habe überprüft, dass das Bild I bin vorbei findContours ist ein binäres Bild:

Ich habe den Typ des Bildes überprüft, das 0 ist, das gleiche wie CV_8U Wert.

Ich habe sogar das Histogramm überprüft, und es gibt nur die Pixel mit Werten 0 und 1

ich auch Beispiele von OpenCV Tutorials und Foren gesucht haben, und ich habe versucht, genau das gleiche zu tun, als in der Beispiel, und das Programm stürzt erneut ab.

Der Code

Hier ist der Code, den ich ausführen:

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

Antwort

4

ich das Problem gefunden zu haben. Der genannte Fehler tritt scheinbar auf, weil ich die Debug-Konfiguration von Visual Studio 2013 mit den OpenCV-Release-Bibliotheken (* .libs, die nicht über das 'd' verfügen) verwendet habe. Ich habe das Programm mit der Release-Konfiguration getestet und es funktioniert. Ich habe sogar die erkannten Konturen gezeichnet und die Funktion funktioniert einwandfrei.

+2

Sie müssen darauf achten, keine Release-DLLs in Debug-Anwendungen oder Debug-DLLs in Release (oder Mischen von Compiler-Versionen) zu verwenden. Beides führt dazu, dass Sie mehr als einen inkompatiblen Heapspeicher haben, der eine Heap-Beschädigung verursacht, wenn Sie versuchen, den zugewiesenen Speicher von dem anderen zu befreien. Die Heap-Beschädigung verursacht nicht immer einen sofortigen Absturz, daher kann es schwierig sein, den Grund zu ermitteln. – drescherjm

Verwandte Themen