2009-11-19 13 views
5

Voici mon code actuel (langue est Python):Affichage OpenCV structures de données iplimage avec 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())) 

Je suis en train d'afficher un iplimage capturé de ma webcam dans une fenêtre wxPython. Le problème est que je ne veux pas d'abord stocker l'image sur le disque dur. Y at-il un moyen de convertir une image dans un autre format d'image en mémoire? Toute autre solution?

J'ai trouvé quelques "solutions" à ce problème dans d'autres langues, mais j'ai toujours des problèmes avec ce problème.

Merci.

Répondre

1

Vous pouvez faire avec StringIO

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

vous pouvez vérifier plus en détail dans \ wx \ lib \ embeddedimage.py

juste mes 2 cents.

+0

Pourriez-vous élaborer un peu? D'où viennent les données? – Domenic

+0

ok, laissez-moi essayer de le tester. Attends un moment. – YOU

+0

J'ai trouvé que opencv n'a pas d'API pour écrire ImageData dans le flux http://opencv.jp/opencv-1.0.0_org/docs/ref/opencvref_highgui.htm#highgui_func_index afin de trouver d'autres moyens. – YOU

6

Qu'est-ce que vous avez à faire est:

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())) 

je me suis dit OYT comment faire cela en regardant la Python OpenCV cookbook et au wxPython wiki.

+1

Je suis bien conscient que Ce message date d'il y a un an, mais c'est la question SO la plus élevée sur Google pour ce problème. – voyager

3

Oui, cette question est ancienne mais je suis venu ici comme tout le monde à la recherche de la réponse. Plusieurs versions de wx, numpy, et opencv après les solutions ci-dessus, j'ai pensé que je partagerais une solution rapide en utilisant des images cv2 et numpy.

Voici comment convertir une image de style tableau numpy tel qu'il est utilisé dans OpenCV2 dans un bitmap vous pouvez définir un élément d'affichage dans wxPython (comme d'aujourd'hui):

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) 

Testé il y a 10 minutes :)

Ceci utilise la fonction wx intégrée BitmapFromBuffer et profite de l'interface tampon NumPy pour que tout ce que nous avons à faire est d'échanger les couleurs pour les obtenir dans l'ordre attendu.