Webcam Anbindung und Darstellung mittels QT

Alles rund um die Programmierung mit Qt
cyril
Beiträge: 4
Registriert: 18. September 2006 20:28

Webcam Anbindung und Darstellung mittels QT

Beitrag von cyril »

Hallo zusammen!

Ich arbeite grad an einer Semesterarbeit im Bereich Computer Vision. Ich verwende WinXP, QT4 und möchte das Bild einer WEBCAM (Logitech) innerhalb meines GUI, welches ich mit QT gebaut habe, darstellen. Das ganze sollte wenn möglich Plattform unabhängig sein.

Ich weiss, das Anbinden der webcam hat mit QT im Grunde nichts zu tun. Denke aber, dass es mittels QT (QMovie oder sowas) eine einfache Möglichkeit geben könnte sowas zu machen.

Leider gibt es für solche Video/Webcam Probleme nicht sehr viel hilfreiches Material sprich Tutorials oder example code. Und auch im QT Assistant steht nix drinnen, womit ich was anfangen könnte.

Hat jemand von Euch Erfahrung? Ich wäre Dir/Euch sehr verbunden, wenn ihr mich mit Tipps, Links oder aber am besten anschaulichen Code Snipplets beraten könntet.

PS: Habs zuallererst mit openCV versucht. Da ist das mit der Anbindung ein Kinderspiel. Bloss kriegt man da als Ergebnis ein "IplImage" und das lässt sich anscheinend nicht so leicht in ein QImage umwandeln...
Arne B.
Beiträge: 1
Registriert: 24. November 2006 16:47

Beitrag von Arne B. »


PS: Habs zuallererst mit openCV versucht. Da ist das mit der Anbindung ein Kinderspiel. Bloss kriegt man da als Ergebnis ein "IplImage" und das lässt sich anscheinend nicht so leicht in ein QImage umwandeln...
Bin auch QT + Opencv Neuling, aber du kannst zur Not doch den Umweg über die Festplatte machen:
Folgendes klappt in meinem Programm:

#include "cv.h"
#include "highgui.h"

IplImage * img= cam->getOnlineImage();
cvSaveImage("Testbild.bmp",img);
QImage* i=new QImage("Testbild.bmp");

Es gibt in highgui.h auch noch diese Funktion:

/* utility function: convert one image to another with optional vertical flip */
CVAPI(void) cvConvertImage( const CvArr* src, CvArr* dst, int flags CV_DEFAULT(0));

Mit der kann man das sicherlich direkt wandeln.

Gruß Arne
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

OpenGL Anzeige

Beitrag von Volker »

Über die Festplatte??? Nicht besonders performant oder?

Hab mal eine OpenGL Display Klasse angehängt, mit der sich recht leicht ein Bild anzeigen lässt.

Um nun ein IplImage anzuzeigen, fügt man die angehängte Klasse QtGLContext in ein beliebiges Widget ein (z.B. als centralWidget von QMainWindow) und ruft die Methode setImage von QtGLContext auf.

Code: Alles auswählen


IplImage* imgPtr = /* irgendwo her den Pointer auf das bild holen*/;

m_glContext->setImage((unsigned char*)imgPtr->imageData, imgPtr->width, imgPtr->height, imgPtr->nChannels * imgPtr->depth);


Und in einer update Routine, die z.B. von einem QTimer gesteuert werden kann, wird dann einfach nur

Code: Alles auswählen

m_glContext->updateGL();
aufgerufen und falls nötig das Bild vorher aktualisiert (wenn z.B. von einem Video gegrabbt wird, vorher das nächste Bild holen)
Dateianhänge
QtGLContext.cpp
(7.53 KiB) 317-mal heruntergeladen
QtGLContext.h
(1.97 KiB) 301-mal heruntergeladen
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Ich arbeite mit Visual Studio, deswegen kann ich keine direkte Lösung geben. Aber prinzipiell musst du bei beiden Varianten halt jeweils die nötigen Lib Dateien zum linken angeben (bei opencv die cxcore.lib, cv.lib und highgui.lib, bei qt die qtopengl4.lib qtgui4.lib und qtcore4.lib) außerdem dürftest du auch noch die opengl32.lib benötigen. Das alles bezieht sich auf die Windows version. Wie die lib dateien unter Linux oder Mac Os heißen weiss ich nicht.
Neben den Lib Dateien musst du natürlich auch noch dafür sorgen, dass der Compiler die Header Dateien findet.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

hast du qt vielleicht nur mit --debug kompiliert? die libs mit d am ende (DATEINAMEd.dll) sind normalerweise die debug-libs.

mfg,
julian
heikob
Beiträge: 81
Registriert: 23. März 2005 23:20

Beitrag von heikob »

Eine andere Idee, womit du eventuell um OpenGL herum kommst. Ist nur eine Idee und nicht getestet!

Könnte dir vielleicht eine dieser Funktionen helfen um an dein Bild als QImage zu kommen?

Code: Alles auswählen

bool loadFromData ( const uchar * data, int len, const char * format = 0 )
bool loadFromData ( const QByteArray & data, const char * format = 0 )
Letztendlich macht der OpenGl-Aufruf ja nichts anderes. Zumindest soweit ich das im Moment sehe.

Es würde mich interessieren, ob das so auch funktioniert.

Heiko
gerd87
Beiträge: 41
Registriert: 18. Februar 2007 17:37

Beitrag von gerd87 »

hallo, wie kompiliert man qt mit opencv?

weiter oben ist dieser quelltext:

Code: Alles auswählen

#include "cv.h" 
#include "highgui.h" 

IplImage * img= cam->getOnlineImage(); 
cvSaveImage("Testbild.bmp",img); 
QImage* i=new QImage("Testbild.bmp"); 

Da ist Qt mit OpenCv gemischt.
Wenn ich das bei mir kompilieren will, findet der nicht alle header.
Arbeite mit Eclipse.
gerd87
Beiträge: 41
Registriert: 18. Februar 2007 17:37

Beitrag von gerd87 »

Habe es endlich zum laufen bekommen, indem ich die Libs in das Makefile eingetragen habe.
Jetzt habe ich das selbe problem, dass ich IplImage in QT anzeigen muss.

Habe die Klasse QTGlContext eingebunden und bekomme jetzt folgenden Fehler:


release\moc_QtGLContext.o(.rdata$_ZTV11QtGLContext[vtable for QtGLContext]+0x14):moc_QtGLContext.cpp: undefined reference to `QtGLContext::~QtGLContext()'
release\moc_QtGLContext.o(.rdata$_ZTV11QtGLContext[vtable for QtGLContext]+0x18):moc_QtGLContext.cpp: undefined reference to `QtGLContext::~QtGLContext()'
release\moc_QtGLContext.o(.rdata$_ZTV11QtGLContext[vtable for QtGLContext]+0x58):moc_QtGLContext.cpp: undefined reference to `QtGLContext::mousePressEvent(QMouseEvent*)'
release\moc_QtGLContext.o(.rdata$_ZTV11QtGLContext[vtable for QtGLContext]+0x5c):moc_QtGLContext.cpp: undefined reference to `QtGLContext::mouseReleaseEvent(QMouseEvent*)'
release\moc_QtGLContext.o(.rdata$_ZTV11QtGLContext[vtable for QtGLContext]+0x64):moc_QtGLContext.cpp: undefined reference to `QtGLContext::mouseMoveEvent(QMouseEvent*)'
release\moc_QtGLContext.o(.rdata$_ZTV11QtGLContext[vtable for QtGLContext]+0xf0):moc_QtGLContext.cpp: undefined reference to `QtGLContext::initializeGL()'
release\moc_QtGLContext.o(.rdata$_ZTV11QtGLContext[vtable for QtGLContext]+0xf4):moc_QtGLContext.cpp: undefined reference to `QtGLContext::resizeGL(int, int)'
release\moc_QtGLContext.o(.rdata$_ZTV11QtGLContext[vtable for QtGLContext]+0xf8):moc_QtGLContext.cpp: undefined reference to `QtGLContext::paintGL()'
release\moc_QtGLContext.o(.rdata$_ZTV11QtGLContext[vtable for QtGLContext]+0x118):moc_QtGLContext.cpp: undefined reference to `non-virtual thunk to QtGLContext::~QtGLContext()'
release\moc_QtGLContext.o(.rdata$_ZTV11QtGLContext[vtable for QtGLContext]+0x11c):moc_QtGLContext.cpp: undefined reference to `non-virtual thunk to QtGLContext::~QtGLContext()'
collect2: ld returned 1 exit status
mingw32-make.exe[1]: *** [release\chat.exe] Error 1


Kann mir da jemand weiterhelfen?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
gerd87
Beiträge: 41
Registriert: 18. Februar 2007 17:37

Beitrag von gerd87 »

Danke für die Antwort, bin jetzt wieder ein stück weiter.

Momentan hänge ich an dieser Fehlermeldung.
Der Fehler wird in der QTGlContext.cpp verursacht. Bin aber noch nicht dahinter gekommen.


QtGLContext.cpp: In member function `void QtGLContext::drawTexture(float, float, float, float)':
QtGLContext.cpp:75: error: `GL_BGR_EXT' undeclared (first use this function)
QtGLContext.cpp:75: error: (Each undeclared identifier is reported only once for each function it appears in.)
QtGLContext.cpp:80: error: `GL_BGRA_EXT' undeclared (first use this function)
QtGLContext.cpp: In member function `virtual void QtGLContext::mousePressEvent(QMouseEvent*)':
QtGLContext.cpp:127: warning: passing `float' for converting 1 of `void QPoint::setX(int)'
QtGLContext.cpp:129: warning: passing `float' for converting 1 of `void QPoint::setY(int)'
QtGLContext.cpp: In member function `virtual void QtGLContext::mouseReleaseEvent(QMouseEvent*)':
QtGLContext.cpp:140: warning: passing `float' for converting 1 of `void QPoint::setX(int)'
QtGLContext.cpp:142: warning: passing `float' for converting 1 of `void QPoint::setY(int)'
QtGLContext.cpp:166: warning: comparison between signed and unsigned integer expressions
QtGLContext.cpp:167: warning: comparison between signed and unsigned integer expressions
QtGLContext.cpp: In member function `virtual void QtGLContext::mouseMoveEvent(QMouseEvent*)':
QtGLContext.cpp:180: warning: passing `float' for converting 1 of `void QPoint::setX(int)'
QtGLContext.cpp:182: warning: passing `float' for converting 1 of `void QPoint::setY(int)'
mingw32-make.exe[1]: *** [release\QtGLContext.o] Error 1


Die Headerdatei habe ich mit
#include "QtGLContext.h"
aufgerufen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

GL_BGR_EXT ist im Windows-Header GL.h definiert -> http://msdn.microsoft.com/library/defau ... 3_8m7n.asp -> Header: Declared in Gl.h.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
gerd87
Beiträge: 41
Registriert: 18. Februar 2007 17:37

Beitrag von gerd87 »

Danke für die Antwort.

Habe versucht gl.h zu includieren, bringt leider nichts.
Meine weiteren versuche: opengl32.lib einzubinden, windows.h, glext.h includieren.
Bei google habe ich leider auch nichts dazu gefunden?

Vielleicht weiß noch jemand Rat.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Hast Du mal geschaut ob es bei Dir in gl.h diese Konstante überhaupt gibt? Ich mein - bevor man rumsucht sollte man einfach erstmal nachschauen...

Wenn nicht, würde ich mal das aktuelle PlatformSDK installieren da es dort auf alle Fälle drin ist.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
gerd87
Beiträge: 41
Registriert: 18. Februar 2007 17:37

Beitrag von gerd87 »

Nee, die Konstante ist dort nicht drin.

die gl.h ist bei mir in C:\MinGW\include\GL

Meinst du mit PlatformSDK MinGW ?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das hast Du davor nicht gesagt. Ich bin von msvc ausgegangen.

MinGW definiert diese Konstanten nicht, also ist es atm mit MinGW wohl nicht möglich. Sollte man mal bei http://sf.net/projects/mingw nachschauen ob sie ggf. planen diese Konstanten hinzuzufügen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten