Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » KDevelop / Qt / wxWidget » Videostream einer Webcam auf ein QLabel?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
10.09.2004, 14:56 Uhr
dad_an_der_fh



Hi,

bin noch nicht allzusehr vertraut mit QT und
habe daher ein für mich kniffliges Problem. Ich möchte gern
das Bild einer WebCam auf ein QLabel darstellen.

Ich benutzt einen Buffer mit Bilddaten im RGB-Format.
Der Datentyp ist ein unsigned char - Array[].
Ich habe auch noch die Bildgroesse.

Mit welcher Funktion komme ich da am besten voran?
Oder sollte ich da anders herangehen?
Hat jemand eine Idee oder Vorschläge?


C++:
dataPtr = (unsigned char*)m_frameGrabber.GetBuffer();

printf("-width=%d -height=%d -channel=%d",xsize ,ysize,1);

1- videoplane->QPixmap::QPixmap(dataPtr);
2- videoplane->setPixmap( QPixmap::loadFromData(dataPtr, ?, ?, ?) );
3- videoplane->setMovie( QMovie::QMovie(*dataPtr, ?) );





Gruß und Dank


Bearbeitung von typecast:
Boardcode aktiviert

Dieser Post wurde am 12.09.2004 um 21:12 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.09.2004, 21:17 Uhr
typecast
aka loddab
(Operator)


Also prizipiell muesst man da zuerst wissen, in was fuer einem Format die Werte vorliegen.
Die Idee das Bild auf einem QLabel darzustellen, halte ich fuer sehr fragwuerdig (ich wuerde jetzt mal ohne genauere Recherche sagen, dass das nicht moeglich ist).

Alles andere haengt davon ab, was das fuer ein Datensatz ist (XPM, JPG...)
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.09.2004, 08:54 Uhr
dad_an_der_fh



Das Video liegt als RGB(A)-Format vor.
Es ist ein Array, dessen Größe sich aus HöhexBreiteXFarbtiefe berechnet.
Für jede dieser Positionen liegt dann ein RGB-Wert vor.
Der Datentyp dieses Array's ist ein unsigned char.

Welche anderen Ansätze gibt es, um solch ein Video in QT einzubinden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.09.2004, 12:54 Uhr
~Frank
Gast


Der einzige Weg, den ich sehe ist
RGB Daten -> QImage -> QPixmap -> mittels bitBlt auf ein Widget malen.

Das LoadFromData hat bei mir aber nie hingehauen. Beim QImage kann man Pixel für Pixel setzen.
QImage -> QPixmap dann mittels convertFromImage.

Erwarte aber keine gute Performance, schon garnicht Fullscreen mit 25 fps, oder so.

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.09.2004, 07:22 Uhr
typecast
aka loddab
(Operator)


Also erstens kann man ein QImage direkt mittels bitBlt zeichnen lassen und braucht nicht die sehr Zeitaufwendige Konvertierung (QImage ist auch ein QPaintDevice).

Zum laden in das QImage gibt es zwei Moeglichkeiten:

1.) Jedes Pixel manuell selber setzen (wie Frank das vorgeschlagen hat). Das ist nicht wirklich so aufwendig, weil weil die Qt-Funktionen das wohl genauso machen werden.

2.) Du kannst versuchen das Array direkt an einen QImage-Konstruktor zu uebergeben. Allerdings habe ich das noch nie gemacht und kann dir nicht sagen ob das Funktionieren wird.
Der Konsturktor waere:


C++:
QImage::QImage ( uchar * yourdata, int w, int h, int depth, QRgb * colortable, int numColors, Endian bitOrder )



Da musst du allerdings mal bei einigen Werten experimentieren. Breite, Hoehe und Farbtiefe sollten ja bekannt sein (muessen sie ja, weil du sonst nicht wirklich ein richtiges Bild zeichnen kannst )
Bei QRgb wuerde ich vorschlagen, dass du einen 0 Zeiger uebergibst (es wird dann eine colortable nach dem Wert von numColors angelegt).
numColors musst du halt entsprechend der Farbtiefe waehlen. Und mit bitOrder bleibt dir nur ausprobieren (sind ja nur drei Moeglichkeiten )
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.09.2004, 08:34 Uhr
~Frank
Gast


Also erstens kann man ein QImage direkt mittels bitBlt zeichnen lassen und braucht nicht die sehr Zeitaufwendige Konvertierung (QImage ist auch ein QPaintDevice).


Das ist nicht korrekt. Schau mal in die Doku, welche Klassen von QPaintDevice abgeleitet sind.
Du wirst dort kein QImage finden.

Man kann QImage zwar an bitBlt übergeben, die Konvertierung QImage -> QPixmap wird in diesem Falle aber automatisch vorgenommen, da der = Operator überladen ist der dann ebenfalls convertFromImage aufruft.

Gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.09.2004, 09:57 Uhr
typecast
aka loddab
(Operator)


Ups. Da hab ich wohl
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.09.2004, 12:17 Uhr
dad_an_der_fh



Also ich verwende die untenstehende Version.
Jedoch bekomme ich nur ein Schwarzer Bild, mit dem Hinweis
das QImage::smoothScale ein null image ist?

Jedoch gebe ich mir die RGB-Werte aus und da sind definitive Farbwerte vorhanden.


C++:
//im Header:

QImage*   qimage;
QPixmap qpixmap;





C++:
buffersize = m_frameGrabber.GetBufferSize();
frame_depth = (buffersize/(frame_xsize*frame_ysize));

/* grab a video frame */
if(GRAB_32BIT == 0) {
   m_frameGrabber.GrabFrame();
}
else {
   m_frameGrabber.Grab32BitFrame();
}

if( (dataPtr = (unsigned char*)m_frameGrabber.GetBuffer()) == NULL ) {
   arUtilSleep(2);
   return;
}

printf("Adresse s: %p\n", &dataPtr);
printf("Groesse : %i\n", sizeof(dataPtr));
printf("Groesse des Buffers: %i\n", buffersize);
printf("R-Wert des Zeigers : %i\n", dataPtr[0]);
printf("G-Wert des Zeigers : %i\n", dataPtr[1]);
printf("B-Wert des Zeigers : %i\n", dataPtr[2]);
printf("A-Wert des Zeigers : %i\n", dataPtr[3]);
printf("Breite des Frames  : %i\n", frame_xsize);
printf("Hoehe des Frames   : %i\n", frame_ysize);
printf("Tiefe des Frames   : %i\n", frame_depth);

if(dataPtr!=0)
{
qpixmap.convertFromImage(QImage::QImage( (uchar*)dataPtr, frame_xsize, frame_ysize, frame_depth, 0, frame_depth, QImage::IgnoreEndian ));
videoplane->setPixmap(qpixmap);
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.09.2004, 14:48 Uhr
~Frank
Gast


Ist das QImage ok, wenn du es abspeicherst?
Denke mal, es hapert da schon am Konstruktor.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
15.09.2004, 09:24 Uhr
dad_an_der_fh



Ich bin mit dem Debugger durch und habe für qimage folgende Daten:


Zitat:

- qimage {...} QImage
- data 0x00cc73e0 QImage::QImageData *
+ QShared {...} QShared
w 320 int
h 240 int
d 4 int
ncols 4 int
nbytes 38400 int
bitordr 2 int
- ctbl 0x00cdd718 unsigned int *
0 unsigned int
- bits 0x00d2b378 unsigned char * *
- 0x02d20040 "‚qi" unsigned char *
130 '‚' unsigned char
alpha false bool
dpmx 0 int
dpmy 0 int
- offset {x=0 y=0} QPoint
xp 0 int
yp 0 int
misc 0x00000000 QImageDataMisc *
ctbl_mine true bool



Kann sein das es beim
qpixmap.convertFromImage(qimage);
hängt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ KDevelop / Qt / wxWidget ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: