Wie kann ich ein IplImage in ein QImage umwandeln?
-
Hi,
ich versuche zur Zeit ein IplImage (openCV) in ein QImage(qt) zu konventieren.
Bis jetzt habe ich das nur so geschafft:cvSaveImage("bild.bmp", ipl_image); qt_image->load("bild.bmp");
Allerdings eine unschöne Methode, da das Bild ja zuerst auf der Fesplatte gespeichert wird.
Weiß jemand wie ich das ein bisschen "schöner" machen kann?mfg der eine
PS: Ich hoffe das ich in diesem Subforum richtig bin (hat ja was mit qt zu tun). Ansonsten kann ein Mod den Thread ja verschieben
-
Ich kenne IplImage (openCV) nicht. Deshalb kann es auch sein, dass Qt dieses Format nativ nicht kennt. Wenn das der Fall ist, müsstest du ein Image I/O Plugin schreiben.
Am einfachsten wäre wohl der Hack ein QImage gleicher Größe zu erzeugen und die Pixel selbst zu setzen.
-
Hallo,
Schon mal danke für die Vielzahl der Antworten.Ponto schrieb:
Ich kenne IplImage (openCV) nicht. Deshalb kann es auch sein, dass Qt dieses Format nativ nicht kennt.
Wahrscheinlich kennt Qt das Format nicht
Ponto schrieb:
Am einfachsten wäre wohl der Hack ein QImage gleicher Größe zu erzeugen und die Pixel selbst zu setzen.
Allerdings gibt es bei qimage die funktion:
bool loadFromData ( const uchar * buf, uint len, const char * format = 0 )
Ich frage mich ob sich mit dieser Funktion etwas anfängen lässt. Allerdings stellt sich die Frage was für Variablen des IplImages übergeben werden müssen. Alles was ich versucht habe ist bis jetzt fehlgeschlagen. Vielleicht kann mir einer helfen? http://eris.liralab.it/yarp/specs/dox/user/html/dd/db1/IplImage_8h-source.html
Oder gibt es noch andere Funktionen von qt/Iplimage, die eine konventierung möclich machen?
Ansonsten werde ich wohl die Idee von Ponto mal probierenmfg der eine
-
der eine schrieb:
Allerdings gibt es bei qimage die funktion:
bool loadFromData ( const uchar * buf, uint len, const char * format = 0 )
Ich frage mich ob sich mit dieser Funktion etwas anfängen lässt. Allerdings stellt sich die Frage was für Variablen des IplImages übergeben werden müssen.
Das was du übergibst muss ein Format haben, das Qt bekannt ist. Deshalb der format Parameter.
Der erste Link hilft nicht?
http://www.google.de/search?hl=de&q=IplImage+qt&btnG=Suche&meta=
-
Hallo,
Du meinst den hier: http://groups.google.com/group/OpenCV/browse_thread/thread/adecb85d719954e6/ee022f60542be011?lnk=st&q=opencv+qt&rnum=2 ??
Den hatte ich noch nicht gefunden, sieht auch ganz gut aus. Nur nutzt das Funktionen die in Version 4 von qt nicht mehr unterstützt werden:qImage = new QImage(qImageBuffer, width, height, 8, colorTable, 256, QImage::IgnoreEndian);
Zum Beispiel obriger Konstruktor.
Weiß jemand, was stattdessen geschrieben werden kann?mfg der eine
-
kann mir niemand weiterhelfen??
-
Habe das hier über google gefunden, habe selbes Problem.
Gibt es inzwischen eine Lösung?
-
Hallo,
googeler schrieb:
Habe das hier über google gefunden, habe selbes Problem.
Gibt es inzwischen eine Lösung?Nein, bis jetzt löse ich es noch über die Festplatte.
Was ich jetzt auch schon öfters gelesen habe, ist es mit opengl-funktionen zu machen.mfg
der eine
-
der code auf http://worldant.blog.sohu.com/54848846.html kompiliert schonmal
-
also ich habe sowas gemacht:
IplImage *img; img = cvQueryFrame(capture); int lines = (int)img->height; int rows = (int)img->width; myQImage = new QImage((uchar *) img->imageData, rows, lines,QImage::Format_RGB888); *myQImage = myQImage->rgbSwapped(); //damit die farben stimmen
nun ja, das bild ist dann halt noch auf dem Kopf, aber immerhin funzts!!
-
McLee schrieb:
also ich habe sowas gemacht:
IplImage *img; img = cvQueryFrame(capture); int lines = (int)img->height; int rows = (int)img->width; myQImage = new QImage((uchar *) img->imageData, rows, lines,QImage::Format_RGB888); *myQImage = myQImage->rgbSwapped(); //damit die farben stimmen
nun ja, das bild ist dann halt noch auf dem Kopf, aber immerhin funzts!!
Bei mir funzt das nicht, er findet das Format_RGB888 nicht...
»Format_RGB888« ist kein Element von »QImage«
kann mir bitte jemand helfen?
-
Weiß niemand warum das nicht geht?
Mir scheint er kennt die ganzen RGB*** formate nicht. Andere gehen...
-
Also von RGB888 hab ich auch noch nie was gehört. Schau einfach mal was QImage für Dinge unter Format_ anbietet.
-
Das RGB-Format ist in Qt aus Performancegruenden identisch mit RGBA (beide 4 Byte, nur wird die Alpha-Komponente ignoriert), waehrend OpenCV 1 Byte pro Farbkomponente annimmt.
Versuch's mal so:
IplImage *img= ... QImage *image= new QImage(img->width, img->height, QImage::Format_RGB32); for (int y=0;y<img->height;y++) { unsigned int *dst= (unsigned int*)image->scanLine(y); unsigned char *src= (unsigned char*)img->imageData + y*img->width*3; for (int x=0;x<img->width;x++,src+=3) { *dst++= src[0] | (src[1]<<8) | (src[2]<<16) | (0xff<<24); } }
-
http://doc.trolltech.com/4.4/qimage.html#Format-enum
dort gibt es RGB888???@hellihjb: Es kommt immer ein weißes Bild mit ein paar roten punkten raus... (egal was ich mach)
-
????? schrieb:
http://doc.trolltech.com/4.4/qimage.html#Format-enum
dort gibt es RGB888???und dort noch nicht.
Es kommt immer ein weißes Bild mit ein paar roten punkten raus...
Dann hat Dein IplImage vermutlich einen anderen Aufbau als 24bit BGR.
-
vermutlich...
Und auch einen anderen Aufbau als die anderen Formate die gehen.The following image formats are available in all versions of Qt:
aber du hast recht, dort gibt es sie nicht...