C++ Fehlermeldung beim einlesen eines Bildes [OPENCV, VisualStudio2013]

azdr

Lieutenant
Registriert
Feb. 2005
Beiträge
685
hi,

Ich verwende Visual Studio 2013 und hab die OpenCV-Bibliotheken nach der Anleitung wie auf ihrer Webseite Eingebungen.

Ich bekomme aber jedesmal eine Fehlermeldung wenn ich versuche ein Bild über "Mat img" einzulesen.

Fehlermeldung: "Unhandled execption at 0x7702C420D in testbsp.exe"

Ich weiß gar nicht was ich dagegen tun soll.

Code:
#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char *argv[])
{
	Mat img = imread("testbild.jpg", 1);

	namedWindow("MyWindow", CV_WINDOW_AUTOSIZE);
	imshow("MyWindow", img);

	waitKey();
	return 0;
}
 
Liegt die Bilddatei im richtigen Verzeichnis? Gib mal zum Test den kompletten Pfad an. Und nicht vergessen doppel \
C:\\Verzeichnis\\testimage.jpg

Den 2. Parameter in imread kann man doch weglassen.

Was Du machen kannst, damit Du auch Probleme im Quellcode der Opencv dlls finden kannst: Lade den Quellcode runter und kompiliere ihn selbst. Das kann sehr nützlich sein, wenn Dein Projekt komplexer werden soll.

Anleitung
 
Ja liegt im richtigen Verzeichnis auch mit vollständigem Pfad nach wie vor die selbe Fehlermeldung.

Liegt es evt. daran weil ich ein Windows 64bit Betriebssystem habe?
 
Normal nicht. In OpenCV gibt es noch diverse Fallstricke. Man muss im Debug Modus zB unbedingt die Debug dlls verwenden. Tut man das nicht, kann es zu solch einer Fehlermeldung kommen. Ich hab leider kein Visual Studio 2013. Du könntest einfach mal das Projekt hochladen. Ich habe zwar nur Visual Studio 2012, aber einen Versuch ist es wert.

Welche Version von OpenCV verwendest Du eigentlich?
 
Zuletzt bearbeitet:
Ich verwende openCV 2.4.10 ich hab mich jetzt genau an diese Anleitung gehalten
https://www.youtube.com/watch?v=vwhTKsvHwfQ

Hier sind die die Einstellungen die ich unter Visual2013 vorgenommen (die fettgedrucktenZeilen wurden geändert).
settings.JPG

Hast du evt. andere Einstellungen bei der Einrichtungen vorgenommen?
 
Also ich kann hier keine Fehler entdecken. Würde eine lib oder ein Include fehlen, dann könntest Du das Ganze ja nicht kompilieren. Würde beim Ausführen eine dll fehlen, würde eine entsprechende Fehlermeldung kommen. Also gehe ich davon aus, dass das Bild nicht gefunden wird, oder dass das Bild eine Macke hat.

Zum Testen: Setze einen Breakpoint nach: Mat img = ....

Gehe dann mit der Maus über img und schau, ob dims und rows größer Null sind. dim sollte 2 sein. Row der Bildhöhe entsprechen.

Wenn hier alles in Ordnung ist, dann schick ich Dir mal mein Projekt. Bei mir funktioniert alles, außer wenn das Bild nicht gefunden wird. Dann gibt es genau so eine Fehlermeldung wie bei Dir.
 
Die Fehlermeldung ist doch ganz klar: Eine nicht-behandelte Exception. Offensichtlich wirft eine Zeile deines Codes eine Exception, die du nicht abfängst. Deshalb wird das Programm beendet.

Lösung: Die Exception abfangen und entsprechend handeln. Packe den ganzen Code in einen try-catch-Block um die Exception abzufangen. Laut Dokumentation (http://docs.opencv.org/modules/core/doc/intro.html#error-handling) wirft OpenCV standardmäßig Exceptions vom Typ cv::Exception, du kannst vermutlich aber auch einfach std::exception abfangen. Dann (wie in der Doku gezeigt) mit e.what() die genaue Fehlermeldung anzeigen lassen.
 
Zuletzt bearbeitet:
Liegen auch die entsprechenden DLL's in einem "systembekannten" Verzeichnis oder im selben Ordner wie der kompilierte Binary?
 
Hellsfoul schrieb:
Also ich kann hier keine Fehler entdecken. Würde eine lib oder ein Include fehlen, dann könntest Du das Ganze ja nicht kompilieren. Würde beim Ausführen eine dll fehlen, würde eine entsprechende Fehlermeldung kommen. Also gehe ich davon aus, dass das Bild nicht gefunden wird, oder dass das Bild eine Macke hat.

Zum Testen: Setze einen Breakpoint nach: Mat img = ....

Gehe dann mit der Maus über img und schau, ob dims und rows größer Null sind. dim sollte 2 sein. Row der Bildhöhe entsprechen.

Habs genau so wie du es beschrieben hast getestet,rows und dims sind NULL, also das Problem ist das Bild wird erst gar nicht eingelesen deswegen auch die Unhandled execption Fehlermeldung.

Also jetzt hab ich nochmal verschiedene Bilder mit vollständig angegebenem Pfad getestet aber immer das gleiche Problem.

Nun was kann ich jetzt eigentlich dagegen tun.
 
azdr schrieb:
Nun was kann ich jetzt eigentlich dagegen tun.

Hast du meinen Beitrag gelesen? Die Lösung besteht darin, die Exception abzufangen und die genaue Fehlermeldung auszugeben. Dann siehst du auch, ob jetzt die Datei nicht eingelesen werden konnte oder ob das Bild beschädigt ist oder oder oder.
 
Genau wie stwe sagt...

Da ich gerad langeweile habe:

Code:
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <cassert>
 
using namespace cv;
using namespace std;
 
int main(int argc, char *argv[])
{
  try
  {
    Mat img = imread("testbild.jpg", 1);
 
    namedWindow("MyWindow", CV_WINDOW_AUTOSIZE);
    imshow("MyWindow", img);
 
    waitKey();
  }
  catch (std::exception& e)
  {
    std::cerr << "FEHLER: " << e.what() << std::endl;
  }
  catch (...)
  {
    std::cerr << "UNBEKANNTER FEHLER!" << std::endl;
    assert(false);
  }
  return 0;
}
 
Zuletzt bearbeitet:
Danke an euch alle,
Ich hab das Problem jetzt so gelöst, ich hab opencv mit cmake installiert, und als platform bei Visual studio 64bit gewählt und die libs und bins ebenfalls als 64bit eingebunden.
Mfg
 

Ähnliche Themen

Zurück
Oben