Seite 1 von 1

Webcam mit OpenCV und QThread funktioniert nicht

Verfasst: 6. Januar 2011 13:14
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.

Verfasst: 6. Januar 2011 13:19
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.

Verfasst: 6. Januar 2011 13:34
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))); 

Verfasst: 6. Januar 2011 13:48
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.

Verfasst: 6. Januar 2011 13:54
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.

Verfasst: 6. Januar 2011 14:43
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);
		}
}

Verfasst: 6. Januar 2011 15:25
von franzf
Dein "capture" ist korrekt? Was ist ein "capture"? Darf das "capture" in einem anderen Thread liegen, als wie cvQueryFrame() aufgerufen wird?

Verfasst: 6. Januar 2011 15:38
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.