Forum: PC-Programmierung cvCaptureFromCAM() in C++ Klassen nicht möglich!


von Matthias R. (mons)


Lesenswert?

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?

von asdf (Gast)


Lesenswert?

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

von Matthias R. (mons)


Lesenswert?

Hab mit gdb genau diese fehlerquelle gefunden...
das C++ Interface wirft in Verbindung mit qt schon genug fehlermeldungen 
aus... :(

von asdf (Gast)


Lesenswert?

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.

von Matthias R. (mons)


Lesenswert?

Beim kompilieren mit dem C++ Interface kommt immer die Fehlermeldung
1
cannot convert 'cv::Mat' to 'const CvArr*

von asdf (Gast)


Lesenswert?

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

von Matthias R. (mons)


Lesenswert?

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.