OpenCV-Image zu gtkimage konvertieren

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
duese
User
Beiträge: 2
Registriert: Montag 13. August 2007, 13:21

Hallo!

Wie der Betreff schon sagt, möchte ich ein OpenCV-Image zu einem GTKImage konvertieren. Ich hole mir zunächst ein Bild von der Webcam und will es dann konvertieren. Ich habe versucht, den Weg über die PIL-Library [1,2] zu gehen, als auch den Weg über Numpy (finde den Link gerade nicht wieder). Beide Wege funktionieren nicht.

Auch folgende Funktion nicht:

Code: Alles auswählen

def image2pixbuf(im):  
    file1 = StringIO.StringIO()  
    im.save(file1, "ppm")  
    contents = file1.getvalue()  
    file1.close()  
    loader = gtk.gdk.PixbufLoader("pnm")  
    loader.write(contents, len(contents))  
    pixbuf = loader.get_pixbuf()  
    loader.close()  
    return pixbuf  
Das Problem ist immer, dass bei allen Bildern der Rot- und Blau-Kanal vertauscht ist.

Ich habe mir den Code von opencvplayground [3] angesehen, wo erfolgreich ein Bild von opencv zu einem pixbuf für gtk konvertiert wird. Allerdings wird dort highgui direkt angesprochen:

Code: Alles auswählen

img_a = highgui.cvQueryFrame( self.capture )
statt

Code: Alles auswählen

img_b = cv.QueryFrame(self.capture)
Es scheint so, als ob img_a ungleich img_b ist, da img_a ein Attribut img_a.imageData hat, welches man dann in der Funktion gtk.gdk.pixbuf_new_from_data() als erstes Argument einsetzen kann.

Was mache ich falsch?

Gruß,
duese

[1] http://faq.pygtk.org/index.py?req=show& ... 08.005.htp
[2] http://opencv.willowgarage.com/document ... -pil-image
[3] http://opencvplayground.googlecode.com/svn
deets

Ueblicherweise hat OpenCV als Pixelformat BGR statt RGB - womit sich genau dein Ergebnis einstellt. Mit der Funktion cvConvert kannst du in den RGB-Farbraum umkonvertieren.
duese
User
Beiträge: 2
Registriert: Montag 13. August 2007, 13:21

Danke deets! Da hätte ich auch drauf kommen können, aber irgendwann sieht man den Wald vor lauter Bäumen nicht mehr.

Was ich noch nicht verstehe ist, dass img_a und img_b unterschiedlich sind. Gibt es dafür eine Erklärung?

Gruß,
duese
deets

Ich kenne mich mit dem Python-Binding nicht so gut aus, aber die OpenCV ist in der Transition von C nach C++. Die C-calls haben alle ein cvIrgendwas-Format, und die C++ nicht mehr (weil namespace cv::). Koennte also daran liegen, dass es einmal IplImage und einmal Mat ist. Aber das ist jetzt wirklich geraten.
Antworten