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.
|
|