Seite 1 von 2
Webcam Anbindung und Darstellung mittels QT
Verfasst: 25. September 2006 16:19
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...
Verfasst: 24. November 2006 17:42
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
OpenGL Anzeige
Verfasst: 24. November 2006 20:50
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
aufgerufen und falls nötig das Bild vorher aktualisiert (wenn z.B. von einem Video gegrabbt wird, vorher das nächste Bild holen)
Verfasst: 21. Januar 2007 11:07
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.
Verfasst: 22. Januar 2007 20:23
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
Verfasst: 24. Januar 2007 07:37
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
Verfasst: 24. Februar 2007 02:15
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.
Verfasst: 27. Februar 2007 03:49
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?
Verfasst: 27. Februar 2007 06:30
von Christian81
Verfasst: 27. Februar 2007 19:02
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.
Verfasst: 27. Februar 2007 19:09
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.
Verfasst: 28. Februar 2007 20:26
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.
Verfasst: 28. Februar 2007 20:58
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.
Verfasst: 28. Februar 2007 21:13
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 ?
Verfasst: 28. Februar 2007 21:25
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.