2012-04-10 5 views
0

ich benutze diese funktionen, um zeichen bild zu segmentieren, aber das programm crach, somone kann mir helfen, bitte lösung zu finden, warum es crach?opencv zeichen void segmentierung

+1

Können Sie es im Debug-Modus laufen und uns sagen, welche Linie abstürzt, bitte? Welches Betriebssystem und welchen Compiler verwenden Sie? – dannyxyz22

+0

Ich benutze Qt Creator, um zu kompilieren, aber ich denke, ich habe kein Kompilierungsproblem, weil wenn ich nur die fünf ersten Zeilen versuche, führe ich das SetImageROI aus, aber wenn ich den Code von CvFindContours hinzufüge, dann denke ich, dass ich ein Problem habe im Code der Kontur – Butterflay

+0

Wenn diese Frage erfolgreich beantwortet wurde, sollten Sie die offizielle Antwort auswählen, indem Sie auf das Kontrollkästchen in der Nähe klicken. Wenn nicht, sollten Sie Ihre eigene Antwort hinzufügen. – karlphillip

Antwort

0

Sie müssen die Linie bestimmen, die den Absturz verursacht. Dafür kann ich auf zwei Arten denken:

  • Verwenden Sie einen Debugger;
  • oder wenn Sie Angst, dass, verwenden Sie die printf() Methode:

Die printf() Verfahren beinhaltet in Ihrem Programm einen printf() Anruf nach jedem Funktionsaufruf platzieren, so dass, wenn Sie Ihre Anwendung ausführen können Sie in der Konsole sehen was war die letzte printf() Nachricht. Dadurch können Sie den Code finden, der für den Absturz verantwortlich ist. Beispiel:

printf("dbg10\n"); 

IplImage *img_cv = cvLoadImage("plaque.jpg"); 
printf("dbg20\n"); 

cvSetImageROI(img_cv,cvRect(8,10,60,35)); 
printf("dbg30\n"); 

IplImage *img_pl = cvCreateImage(cvGetSize(img_cv),img_cv->depth,img_cv->nChannels); 
printf("dbg40\n"); 

cvCopy(img_cv,img_pl, NULL); 
printf("dbg50\n"); 

cvResetImageROI(img_cv); 
printf("dbg60\n"); 

//etc 

Von dem, was ich in Ihrem Code gesehen, haben die ersten zwei Anrufe das Potenzial, Ihre Anwendung zum Absturz bringen: wenn cvLoadImage() ein Bild nicht geladen werden kann wird es einen NULL-Zeiger zurück. Da die nächste Funktion den Zeiger als Parameter empfängt, versucht sie, den Nullzeiger zu dereferenzieren, was zu einem Absturz führen kann. Lösung? Überprüfen Sie immer die freaking Rückkehr der Anrufe, die Sie machen:

IplImage *img_cv = cvLoadImage("plaque.jpg"); 
if (!img_cv) 
{ 
    printf("Failed to load image.\n"); 
    exit(1); 
} 

cvSetImageROI(img_cv,cvRect(8,10,60,35)); 
+0

Ich versuche es mit Printf(), aber es ist nicht in Ordnung !!! es crach – Butterflay

+0

Die printf-Aufrufe sind nur, um Ihnen einen Hinweis darauf, wo der Absturz passiert, wird es nicht das Problem beheben. – karlphillip

Verwandte Themen