Webcam mit OpenCV und QThread funktioniert nicht

Alles rund um die Programmierung mit Qt
Antworten
Tom_Tom
Beiträge: 54
Registriert: 2. August 2008 18:39

Webcam mit OpenCV und QThread funktioniert nicht

Beitrag von Tom_Tom »

Hallo. Ich möchte mir mit OpenCV mehrere Webcams anzeigen lassen. Wenn ich das so mache, wie hier in dem einen Tutorial gut erklärt, funktioniert das auch wunderbar. Wenn ich das ganze allerdings nicht mit dem QTimer, sondern mit einem QThread umsetzen will, funktioniert es nicht. Ich bastel da jetzt schon seit einigen Tagen dran herum und komme nicht weiter. Vielleicht hat ja noch jemand eine Idee von euch. Hier mal der Quelltext meiner run-Methode:

Code: Alles auswählen

void Camera::run() {

	const int sourceID = 0;

	//this->capture ist in der header initialisiert: CvCapture *capture
	this->capture = cvCaptureFromCAM(sourceID);

	this->pixmapItem = new QGraphicsPixmapItem(this->pixmap);
	this->addItem(this->pixmapItem);

	while(true) {
		this->ipImage = cvQueryFrame(this->capture); // Frame auslesen
		if (this->ipImage) //hier ist der Fehler, weil this->ipImage irgendwie immer NULL bleibt
			this->pixmap = QPixmap::fromImage(mirrorImage(convertImage(this->ipImage)));

		this->pixmap = this->pixmap.scaled(this->width(), this->height());
		this->pixmapItem->setPixmap(this->pixmap);
		this->update();
		this->msleep(1000);
	}
}
Ich hoffe, es kann mir noch jemand weiterhelfen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Mal wieder ein 'funktioniert nicht'. Das ist keine Fehlerbeschreibung!
Ich würde sagen Du greifst von einem Thread != Hauptthread auf die GUI zu was nicht zulässig ist.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Tom_Tom
Beiträge: 54
Registriert: 2. August 2008 18:39

Beitrag von Tom_Tom »

Hallo Christian,
vielen Dank für deine Antwort. auch wenn ich sie nicht so ganz verstehe.

Aber das Problem befindet sich ja in den Zeilen:

Code: Alles auswählen

 
this->ipImage = cvQueryFrame(this->capture); // Frame auslesen 
if (this->ipImage) //hier ist der Fehler, weil this->ipImage irgendwie immer NULL bleibt
         this->pixmap = QPixmap::fromImage(mirrorImage(convertImage(this->ipImage))); 
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Warum dort ein NULL-Pointer zurückkommt - keine Ahnung das ist imo kein Qt-Problem. Da sollte man mal bei openCV nachfragen ob das nicht geht wenn es in einem QThread läuft oder so. Gibts ggf. irgendwelche Fehlerabfragen zum überprüfen ob alles korrekt läuft?

Code: Alles auswählen

   this->pixmapItem = new QGraphicsPixmapItem(this->pixmap);
   this->addItem(this->pixmapItem); 
Das verstehe ich nicht - was macht die Funktion 'addItem'?
Wie gesagt - man kann aus einem QThread heraus nicht direkt auf die GUI zugreifen und dort etwas zeichnen. Man kann nur im Hauptthread zeichnen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Tom_Tom
Beiträge: 54
Registriert: 2. August 2008 18:39

Beitrag von Tom_Tom »

Ah jetzt habe ich es verstanden =) und wieder was gelernt.

Ich bastel das jetzt mal um. Leider habe ich nirgends was finden können, warum ich da einen NULL-Pointer zurückbekomme. Es läuft komischerweise nur im Thread nicht.
Tom_Tom
Beiträge: 54
Registriert: 2. August 2008 18:39

Beitrag von Tom_Tom »

Also ich habe das jetzt soweit umgebaut, aber das Problem besteht weiterhin, dass mir das Programm immer abstürzt.

Code: Alles auswählen

void Camera::run() {

		while(this->isRunning()) {
			this->ipImage = cvQueryFrame(this->capture); // Frame auslesen
			QImage image = mirrorImage(convertImage(this->ipImage));  // Bild in QImage konvertieren, auf den Kopf stellen und anzeigen
			emit newCapture(image);
			this->msleep(1000);
		}
}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Dein "capture" ist korrekt? Was ist ein "capture"? Darf das "capture" in einem anderen Thread liegen, als wie cvQueryFrame() aufgerufen wird?
Tom_Tom
Beiträge: 54
Registriert: 2. August 2008 18:39

Beitrag von Tom_Tom »

So ich habe bei meinem Quelltext jetzt mal alles auskommentiert und in in eine Zip gepackt und hier angehängt. Vielleicht ist es dann einfacher verständlich, was ich gemacht habe. Bin schon am verzweifeln.
Dateianhänge
WebCam.zip
(5.83 KiB) 155-mal heruntergeladen
Antworten