Seite 1 von 1

Probleme mit QImage

Verfasst: 4. Mai 2008 19:22
von scarfish
Erstmal hallo leute. Ich hab mir für meine Webcam unter Linux einen kleinen Wrapper geschrieben, mit dem ich jetzt Bilder im PNM Format, genaugenommen das RGB24 aufnehmen kann. Jedoch tauen bei mir da jetzt zwei Probleme auf.
Erstaml zum ersten. Also da QT ja RGB24 nicht unterstützt wollte ich das ganze Pixelweise auslesen und in eine QImage Variable wieder hineinspeichern. Dazu habe ich folgende funktion geschrieben:

Code: Alles auswählen

 void draw_picture(char* source, int breite, int hoehe, QImage& target){
	QRgb pixel;
	for(int x=0;x<breite;x++){
		for(int y=0;y<hoehe;y++){
			pixel=qRgb(source[0],source[1],source[2]);
			target.setPixel(x,y,pixel);
			source+=3;
		}
	}
}
Und Verwenden tue ich es folgendermaßen

Code: Alles auswählen

 QImage img(320,240,QImage::Format_RGB32);
char* picture;
picture = (char*)cam->grab_picture();//gibt bild von der WebCam zurück
draw_picture(picture,320,240,img);
label->setPixmap(QPixmap::fromImage(img));
Leider sind die Bilder danach SEHR seltsam verzerrt. Ich weiß aber das es nicht an der methode grab_picture liegt, weil wenn ich die Daten in eine Datei Packe, kann ich das BIld normal öffnen. Fällt hier vielleicht irgendjemandem etwas auf was ich falsch gemacht habe?


Und dann wäre da auch noch das zweite Problem.
Die einzelnen Bilder möchte ich natürlich hintereinander abspielen.
Zu diesem Zweck verwende ich folgende Schleife im Konstruktor des Widgets das das Label mit dem Bild enthält:

Code: Alles auswählen

while(true){
		picture = (char*)cam->grab_picture();
		draw_picture(picture,320,240,img);
		label->setPixmap(QPixmap::fromImage(img));
		label->show();
	}
Dies geschieht also noch vor dem aufruft von "return app.exec" in der main.cpp falls das irgendeine Bedeutung haben sollte. Jedenfalls erscheint das Label mitsamt Bild erst, wenn ich die Schleife verlasse(ich habe die bedingung testweise auf 100 durchläufe gestellt). Warum ist das so? Und was kann man dagegen tun?

Ich hoffe irgendjemand kann mir hier noch weiterhelfen.
MfG scarfish

Verfasst: 4. Mai 2008 19:38
von upsala
Widgets können nur mit Hilfe des Event-Handlers neu gezeichnet werden. D.h. vergiss die Schleife und beschäftige dich mit Timern.

Zu QImage: 24-Bit gibts hier: QImage::Format_RGB888

Verfasst: 4. Mai 2008 19:44
von scarfish
cool danke. Wie kann ich es denn dann aber eigentlich erreichen, das ein Slot nach dem "return app.exec" aufgerufen wird, ohne eine usereingabe durch einen Button oder ähnliches? Gibt es da vielleicht irgendwelche Signale oder sowas?
E: aber das bild mit einem erneuten Aufruf von setPixmap zu aktualisieren ist doch ok oder? Und QImage::Format_RGB888 scheint noch ziemlich neu zu sein oder? In meiner QT Version gibts das wohl jedenfalls noch nichts :(

Verfasst: 4. Mai 2008 19:56
von upsala
Du hattest keine Qt-Version angegeben, somit gehe ich von der aktuellen aus. Und den Tip mit den Timern hatte ich dir schon gegeben...

Verfasst: 4. Mai 2008 20:06
von scarfish
ja ok, dann werde ich mir Timer mal genauer ansehen. Jedenfalls kann ich hier unter Linux grade keine neuere Version aufspielen, hab daher im moment die 4.3
Also wenn jemand ne Idee hat was im ersten Code nicht stimmen könnte, immer her damit :>

MfG scarfish

Re: Probleme mit QImage

Verfasst: 4. Mai 2008 20:28
von myme
scarfish hat geschrieben:...Jedenfalls erscheint das Label mitsamt Bild erst, wenn ich die Schleife verlasse(...). Warum ist das so? Und was kann man dagegen tun?...
Solange das Programm in der Schleife läuft, werden keine Ereignisse zugestellt, insbesondere keine Show, Paint, etc. Events. Einfügen von "qApp->processEvents();" wäre möglich, ich würde aber auch ein Timer gesteuertes Grabben bevorzugen.

Verfasst: 4. Mai 2008 20:55
von scarfish
ah danke, mir war irgendwie gar nicht bewusst wie QT das mit den Signalen intern umsetzt, da hätte ich in Zukunft bestimmt noch viele Fehler eingebaut.
Aber ich suche noch nach meinem Fehler in der Funktion zum Übertragen der Pixel der Bilder.
MfG scarfish