2017-02-08 3 views
1

Ich habe Probleme bei der Verwendung findContour() Funktion von opencv. Es abstürzen und geben die folgende Fehlermeldung:FindContour OpenCV C++

enter image description here

Hier ist mein Code:

using namespace cv; 
using namespace std; 

Mat src; Mat src_gray; 
int thresh = 100; 
int max_thresh = 255; 
RNG rng(12345); 

/// Function header 
void thresh_callback(int, void*); 

/** @function main */ 
int main(int argc, char** argv) 
{ 
    src = imread("test.png"); 
    /// Load source image and convert it to gray 
    //src = imread(argv[1], 1); 

    /// Convert image to gray and blur it 
    cvtColor(src, src_gray, CV_BGR2GRAY); 
    blur(src_gray, src_gray, Size(3, 3)); 

    /// Create Window 
    char* source_window = "Source"; 
    namedWindow(source_window, CV_WINDOW_AUTOSIZE); 
    imshow(source_window, src); 

    createTrackbar(" Canny thresh:", "Source", &thresh, max_thresh, thresh_callback); 
    thresh_callback(0, 0); 

    waitKey(0); 
    return(0); 
} 

/** @function thresh_callback */ 
void thresh_callback(int, void*) 
{ 
    Mat canny_output; 
    vector<vector<Point> > contours; 
    vector<Vec4i> hierarchy; 

    /// Detect edges using canny 
    Canny(src_gray, canny_output, thresh, thresh * 2, 3); 
    /// Find contours 
    findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 

    /// Draw contours 
    Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3); 
    for (int i = 0; i< contours.size(); i++) 
    { 
     Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); 
     drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point()); 
    } 

    /// Show in a window 
    namedWindow("Contours", CV_WINDOW_AUTOSIZE); 
    imshow("Contours", drawing); 
} 

Alle Einstellung wie Eigenschaftsblatt korrekt ist, wie kann das Programm funktioniert, aber es abstürzen, sobald es das getan thresh_callback Funktionen. Ich benutze Visual Studio 2015 mit opencv 3.0. Ich habe Visual Studio 2012 ausprobiert oder eine andere Version von opencv wie 2.4.9 versucht. Leider funktioniert es immer noch nicht. Hoffe, dass Sie alle mir helfen

zeigte hier meine Karteikarte Einstellungen: 1. Debug x64 Eigenschaftsblatt Debug x64 property sheet

  1. Veröffentlichung x64 Eigenschaftsblatt Release x64 property sheet

Ich bin in der Lage, andere Bildverarbeitungsfunktionen wie cv::imread auszuführen. Nur die findContour() hat Fehler.

aktualisiert

Bibliothekspfad: enter image description here

+1

Bitte verknüpften Libs in beiden Debug zeigen und Release – Miki

+0

haben Blick auf [DIESE] (http://stackoverflow.com/questions/21173829/opencv-findcontours- method-errors? rq = 1) und [THIS] (http://stackoverflow.com/questions/36138982/opencv-3-0-findcontours-crashes?rq=1) –

+0

Hallo @Miki, ich hatte das Bild hochgeladen von verknüpfte Bibliotheken auf den Eigenschaftenblättern. –

Antwort

0

Sie verknüpfen die falschen Bibliotheken.


Du verlinkt in:

C:\opencv\build\x64\ vc12 \lib

Das bedeutet, Sie verwenden OpenCV mit vc12 Compiler (Visual Studio 2013) zusammengestellt. Aber Sie verwenden Visual Studio 2015, daher müssen Sie eine Verknüpfung zu OpenCV erstellen, das mit vc14 kompiliert wurde.

Also, schauen, wenn Sie den Ordner haben:

C:\opencv\build\x64\ vc14 \lib

Wahrscheinlich nicht, weil OpenCV 3.0 nicht die vorkompilierte für VC14 hat.In diesem Fall können Sie entweder:

  1. Recompile OpenCV 3.0 mit VC14
  2. herunterladen OpenCV 3.2 die vorkompilierte Binaries für x64 hat, VC14. Dies ist der empfohlene Ansatz, da OpenCV 3.2 einige nette Funktionen und einige Fehlerkorrekturen hinzugefügt hat.
  3. Verwenden Sie Visual Studio 2013 mit der aktuellen Bibliotheken
+0

Vielen Dank für Ihre Hilfe! Es funktioniert jetzt! Also, wenn ich die OpenCV 3.2 Bibliothek benutze, kann ich nicht in x86 laufen? –

+0

Sie können, aber Sie müssen opencv neu kompilieren – Miki

0

ich Ihren Code getestet habe ich es erfolgreich gegen meine Eingangsbild zusammenstellen kann (binäres Bild von Hand) und die Kontur der Hand bereitstellt . Wie von @Miki erwähnt, müssen Sie Ihre verknüpften Bibliotheken überprüfen. In Eclipse IDE müssen wir gehen zu: Projekt -> Eigenschaften -> C/C++ Build -> Einstellungen. Stellen Sie auf der rechten Seite sicher, dass Sie sich in der Registerkarte "Tool Settings" befinden und gehen Sie dann zu MinGW C++ Linker -> Libraries. Sie müssen in Visual Studio etwas Ähnliches haben, entweder müssen Sie die Bibliotheken überprüfen, die Sie in den Projekteinstellungen in Ihrem Projekt enthalten haben. Sie müssen die folgenden verknüpften Bibliotheken haben abgesehen von den anderen Pflicht Bibliotheken:

  1. libopencv_imgproc300
  2. libopencv_highgui300

Bitte beachten Sie, dass die Zahl 300 schlägt vor, dass die OpenCV Version 3.0 ist, habe ich OpenCV 3.1 so Meine Bibliotheken enthalten am Ende zB die Nummer 310 - libopencv_imgproc310. Lassen Sie mich wissen, ob das hilft.

+0

Ich habe den Ordner opencv geprüft und besteht nur aus opencv_world300d.lib oder opencv_world300.lib. Also setze ich nur opencv_world300d.lib für mein Eigenschaftsblatt. Eigentlich kann es auch auf andere Bildverarbeitungsfunktionen wie imread, imshow usw. funktionieren. Nur die findContour hat Probleme. –