2009-11-19 19 views
5

Hier ist mein aktueller Code (Sprache Python):Anzeige OpenCV IplImage Datenstrukturen mit wxPython

newFrameImage = cv.QueryFrame(webcam) 
newFrameImageFile = cv.SaveImage("temp.jpg",newFrameImage) 
wxImage = wx.Image("temp.jpg", wx.BITMAP_TYPE_ANY).ConvertToBitmap() 
wx.StaticBitmap(self, -1, wxImage, (0,0), (wxImage.GetWidth(), wxImage.GetHeight())) 

Ich versuche, eine IplImage von meiner Webcam in einem WxPython Fenster erfaßt anzuzeigen. Das Problem ist, ich möchte das Bild nicht zuerst auf der Festplatte speichern. Gibt es eine Möglichkeit, ein Iplimage in ein anderes Bildformat im Speicher zu konvertieren? Irgendeine andere Lösung?

Ich habe ein paar "Lösungen" für dieses Problem in anderen Sprachen gefunden, aber ich habe immer noch Probleme mit diesem Problem.

Danke.

Antwort

1

Sie könnten

stream = cStringIO.StringIO(data) 
wxImage = wx.ImageFromStream(stream) 

mit StringIO tun können Sie mehr Details in \ wx \ lib \ embeddedimage.py

nur meine 2 Cent überprüfen.

+0

Könnten Sie ein wenig ausarbeiten? Woher kommen Daten? – Domenic

+0

ok, lass mich versuchen, es zu testen. Warte eine Weile. – YOU

+0

Ich habe festgestellt, dass opencv nicht API hat, um ImageData in den Stream zu schreiben http://opencv.jp/opencv-1.0.0_org/docs/ref/opencvref_highgui.htm#highgui_func_index so andere Wege zu finden. – YOU

6

Was haben Sie zu tun ist:

frame = cv.QueryFrame(self.cam) # Get the frame from the camera 
cv.CvtColor(frame, frame, cv.CV_BGR2RGB) # Color correction 
         # if you don't do this your image will be greenish 
wxImage = wx.EmptyImage(frame.width, frame.height) # If your camera doesn't give 
         # you the stream size, you might have to use (640, 480) 
wxImage.SetData(frame.tostring()) # convert from cv.iplimage to wxImage 
wx.StaticBitmap(self, -1, wxImage, (0,0), 
       (wxImage.GetWidth(), wxImage.GetHeight())) 

Ich dachte OYT, wie dies bei der Python OpenCV cookbook, indem man tun und am wxPython wiki.

+1

Ich bin mir bewusst, dass Dieser Beitrag ist ein Jahr alt, aber es ist die aktuell höchste SO Frage auf Google für dieses Problem. – voyager

3

Ja, diese Frage ist alt, aber ich bin hierher gekommen wie jeder andere auf der Suche nach der Antwort. Mehrere Versionen von wx, numpy und opencv nach den obigen Lösungen Ich dachte, ich würde eine schnelle Lösung mit cv2 und numpy Bilder teilen.

Dies ist, wie ein NumPy Array-Stil Bild zu konvertieren, wie in OpenCV2 in eine Bitmap verwendet werden, können Sie dann in WxPython auf ein Anzeigeelement gesetzt (ab heute):

import wx, cv2 
import numpy as np 

# Start with a numpy array style image I'll call "source" 

# convert the colorspace to RGB from cv2 standard BGR, ensure input is uint8 
img = cv2.cvtColor(np.uint8(source), cv2.cv.CV_BGR2RGB) 

# get the height and width of the source image for buffer construction 
h, w = img.shape[:2] 

# make a wx style bitmap using the buffer converter 
wxbmp = wx.BitmapFromBuffer(w, h, img) 

# Example of how to use this to set a static bitmap element called "bitmap_1" 
self.bitmap_1.SetBitmap(wxbmp) 

vor 10 Minuten getestet :)

Dies verwendet die eingebaute wx-Funktion BitmapFromBuffer und nutzt die NumPy-Puffer-Schnittstelle, so dass wir nur die Farben tauschen müssen, um diese in der erwarteten Reihenfolge zu erhalten.