Problem mit OpenCV Funktion cvFindContours



  • Hallo,

    ich soll im Rahmen einer Projektarbeit einen roten Ball und ein blaues Tor erkennen. Das mit dem roten Ball klappt auch schon ganz gut. Bei dem blauen Tor hab ich noch meine Probleme. Und zwar transferiere ich das Bild in den HSV-Farbraum und filtere mir nur die blauen Objekte heraus. Danach lass ich einen Canny-Filter drüber laufen. Als nächstes will ich mit der cvFindContours-Methode die Konturen des Tores erkennen. Doch beim Aufruf der Funktion schmiert das Programm immer mit der Fehlermeldung
    Code:

    "Unbehandelte Ausnahme bei 0x1012f637 in OpenCV_ImageProcessing.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xffffffff."
    

    ab.

    Der Aufruf dazu:
    Code:

    cvFindContours(thresholded , storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
    

    Die ersten drei Parameter sind folgendermaßen initialisiert:

    IplImage* thresholded = cvCreateImage(cvSize(bild->width,bild->height), IPL_DEPTH_8U, 1);
    CvMemStorage* storage = cvCreateMemStorage(0); 
    CvSeq* contours;
    

    Leider finde ich den Fehler nicht... in allen Examples die ich dazu gefunden habe wird das genauso gemacht... Vielleicht weiß ja einer von euch Rat?

    Gruß Oli



  • Erstmal solltest du mit dem Debugger herausfinden, welcher der Parameter das Problem ist (Haltepunkt setzen, Werte überprüfen).

    Außerdem solltest du auch mal ein paar Rückgaben überprüfen. So weißt du ja z.B. gar nicht, ob das IplImage überhaupt erzeugt werden konnte...



  • ja das hatte ich schon gemacht und die Parameter scheinen auch in Ordung zu sein... das Bild wurde auch richtig geladen, ich hab es mir nach dem Canny-Filter angeschaut... Der "storage"-Parameter hat auchen nen Wert, nur der "contours" ist NULL, aber so hatte ich ihn auch initialisiert.

    Ich hatte jetzt aber mal versucht die "contures.c" aus dem OpenCV-Samples Ordner zu kompilieren und da bringt er mir beim laden der cvFindContures() den gleichen Fehler...



  • ich habe jetzt mal den Quellcode der direkt danach kommt auskommentiert und jetzt funktioniert die Funktion und wenn ich mir dann den first_contours-Parameter angucke, dann steht bei "total" auch 4... was ja heißt das er 4 Konturen erkannt hat, oder?
    Naja aber wenn ich mir die Kanten dann einzeichen will, und den Quellcode wieder mitreinnehme, dann bricht er bei der Funktion ab... der Quellcode ist:

    int Nc = cvFindContours(thresholded_test , storage2, &first_contours, sizeof(CvContour), CV_RETR_LIST);
    //CvScalar rot = CV_RGB(250,0,0);
    //CvScalar blau = CV_RGB(0,0,250);	
    //
    //for( CvSeq* c=first_contours; c!=NULL; c=c->h_next ){
    //	cvDrawContours(thresholded_test , c, rot, blau, 1,	2, 8 );
    //	cvShowImage( "OpenCV Test", thresholded_test );
    //	//for( int i=0; itotal; ++i ){
    //	//	CvPoint* p = CV_GET_SEQ_ELEM( CvPoint, c, i );
    //	//	printf(" (%d,%d)\n", p->x, p->y );
    //	//}
    //	cvWaitKey(0);
    //}
    

    Aber wieso ist das so? Als nächsten Befehl erzeuge ich mir ja nur die Farben-Variable "rot"...


Anmelden zum Antworten