Hallo, wenn ich cvCaptureFromCAM() so aufrufe:
1 | klasse1->klasse2->__capture_webcam__ = cvCaptureFromCAM(0); |
Hängt das Programm sich auf bzw. beendet EXIT_FAILURE... eine Idee?
|
Forum: PC-Programmierung cvCaptureFromCAM() in C++ Klassen nicht möglich!Hallo, wenn ich cvCaptureFromCAM() so aufrufe:
Hängt das Programm sich auf bzw. beendet EXIT_FAILURE... eine Idee? Also zuerst: Gibt's ein Grund für die Benutzung des C Interfaces? Wenn man schon C++ verwendet, kann man auch sein Glück auch mit dem C++ Interface von OpenCV versuchen, das ist etwas einfacher zu verwenden. Außerdem glaub ich, wird dir niemand helfen können bei der spärlichen Informationslage, du wirst schon selber mit dem Debugger durch den Code gehen müssen... OpenCV wird von sehr vielen Leuten verwendet, da wird sich ein Bugreport auffinden lassen, wenn da was nicht funktioniert. Hier wird wahrscheinlich ein Bug im Code drumherum befinden... Hab mit gdb genau diese fehlerquelle gefunden... das C++ Interface wirft in Verbindung mit qt schon genug fehlermeldungen aus... :( OpenCV mit Qt funktioniert wunderbar, lässt sich ja auch optionalerweise gegen Qt linken, so das cv::namedWindow durch Qt umgesetzt wird. Ist OpenCV denn gegen Qt gelinkt? Oder OpenCV in exotischer Konfiguration selbst kompiliert? Man kann das ganze nämlich sehr individuell konfigurieren (mit ohne Kamerasupport, mit/ohne Qt, Eigen,...). OpenCV verhält sich etwas merkwürdig, wenn man bspw. cv::namedWindow (nicht mit Qt gelinkt) mit Qt Fenstern versucht zu mischen. Denn GUI Anwendungen haben ja eine Ereignisschleife und wenn dann aufeinmal Qt und welches-Toolkit-auch-immer-gerade-OpenCV-verwendet zwei endlose Ereignisschleifen haben... Wobei das ganze mit VideoCapture nicht zusammenhängt, aber nur als Hinweis am Rande. Und auch noch ins blaue geraten ums auszuschließen: Version letztens gewechselt? Wenn noch irgendeine .o Datei gegen eine ältere OpenCV .dll/.so linkt wird es in der Regel holprig, wenn man etwas aus der .dll/.so aufruft... ein make clean o.ä. hilft gelegentlich Wunder. Wenn es die erste Benutzung der Membervariablen ist: Pointer des Objektes initialisiert? Der Fehler muss nicht im Aufruf liegen, sondern kann genauso in der Zuweisung in klasse1->klasse2->__capture_webcam__ liegen, wenn klasse1/klasse2 uninitialisierte Pointer sind. Man darf sich nicht täuschen lassen, wenn ein Aufruf einer Memberfunktion klappt, dass das Objekt korrekt ist. Bspw. void Klasse::Memberfunktion() { this->variable = aufruf(); } klasseobjekt->Memberfunktion(); Wenn klasseobjekt uninitialisiert ist, schlägt erst die Zuweisung zu this->variable fehl, der Aufruf klappt noch. Denn der Programmcode zu einer Klasse ist bei allen Objekten gleich, so das der uninitialisierte pointer für den Aufruf der Memberfunktion noch nicht stört, sondern erst bei der Benutzung von irgendwelchen Membervariablen. Wenn der Aufruf von cvCaptureFromCAM außerhalb der Klasse funktioniert, würde ich unbedingt diesen Punkt mal prüfen. Beim kompilieren mit dem C++ Interface kommt immer die Fehlermeldung
Man darf natürlich nicht C und C++ Interface mischen. Da versuchst du wahrscheinlich irgendeine Funktion aus dem C Interface eine Instanz von cv::Mat zu übergeben oder irgendwas in der Richtung. CvArr ist jedenfalls ein Typ vom C Interface, hingegen du von VideoCapture::grab oder was auch immer natürlich die C++ Variante einer Matrix, eben cv::Mat, erhälst. Hilfreicher wäre es, die passende Codezeile zu der Fehlermeldung anzugeben... Habe es hinbekommen, lag daran dass ich einen zeiger auf cv::mat definiert hab?! Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
|
|