Отображение структур данных OpenCV iplimage с помощью wxPython - PullRequest
5 голосов
/ 19 ноября 2009

Вот мой текущий код (язык Python):

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

Я пытаюсь отобразить изображение, снятое с моей веб-камеры, в окне wxPython. Проблема в том, что я не хочу сначала сохранять изображение на жестком диске. Есть ли способ конвертировать iplimage в другой формат изображения в памяти? Любое другое решение?

Я нашел несколько «решений» этой проблемы на других языках, но у меня все еще есть проблема с этой проблемой.

Спасибо.

Ответы [ 3 ]

6 голосов
/ 27 июля 2010

Что вам нужно сделать, это:

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

Я понял, как это сделать, взглянув на Python OpenCV поваренную книгу и wxPython wiki .

3 голосов
/ 01 июня 2013

Да, этот вопрос старый, но я пришел сюда, как и все остальные, в поисках ответа. Я решил, что после нескольких версий wx, numpy и opencv я расскажу о быстром решении с использованием cv2 и numpy images.

Это способ преобразования изображения стиля массива NumPy, используемого в OpenCV2, в растровое изображение, которое затем можно установить для элемента отображения в wxPython (на сегодняшний день ):

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)

Проверено 10 минут назад:)

При этом используется встроенная функция wx BitmapFromBuffer и используется интерфейс буфера NumPy, поэтому все, что нам нужно сделать, это поменять цвета, чтобы получить цвета в ожидаемом порядке.

1 голос
/ 19 ноября 2009

Вы можете сделать с StringIO

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

Вы можете проверить более подробную информацию в \ wx \ lib \ embeddedimage.py

только мои 2 цента.

...