使用BitmapBufferFormat_RGBA(python)将wx位图转换为numpy

时间:2015-10-07 14:58:21

标签: python arrays numpy bitmap wxpython

我尝试使用wxPython捕获窗口并使用cv2处理结果。由于wx具有将位图对象转换为简单RGB数组的内置函数,因此这看起来相当简单。

问题在于我无法弄清楚语法。文档很稀疏,我可以找到的几个例子已弃用或不完整。

这基本上就是我想要的

app = wx.App(False)
img = some_RGBA_array #e.g. cv2.imread('some.jpg')
s = wx.ScreenDC()
w, h = s.Size.Get()
b = wx.EmptyBitmap(w, h)
m = wx.MemoryDCFromDC(s)
m.SelectObject(b)
m.Blit(0, 0, w, h, s, 0, 0)
m.SelectObject(wx.NullBitmap)
b.CopyFromBuffer(m, format=wx.BitmapBufferFormat_RGBA, stride=-1)#<----problem is here
img.matchSizeAndChannels(b)#<----placeholder psuedo
img[:,:,0] = np.where(img[:,:,0] >= 0, b[:,:,0], img[:,:,0])#<---copy a channel

为简单起见,这并没有指定一个窗口,只处理一个频道,但它应该知道我试图做什么。

每当我尝试像使用CopyFromBuffer那样运行它时,它会告诉我存储在&#34; b&#34;中的位图不是一个可读的缓冲区对象,如果我将它传递给SaveFile,它会按预期写出图像。

不确定我在这里做错了什么。

编辑:原来我错误的是尝试使用BitmapBufferFormat_RGBA将wxBitmaps转换为cv2 rgb&#39; s。根据下面的答案,我应该使用以下内容(其中&#34; b&#34;是位图):

wxB = wx.ImageFromBitmap(b)#input bitmap 
buf = wxB.GetDataBuffer() 
arr = np.frombuffer(buf, dtype='uint8',count=-1, offset=0)
img2 = np.reshape(arr, (h,w,3))#convert to classic rgb
img2 = cv2.cvtColor(img2, cv2.COLOR_RGB2BGR)#match colors to original image

1 个答案:

答案 0 :(得分:0)

获得者:

wxpython AttributeError: 'memoryview' object has no attribute '__buffer__'

解决方案是使用:

arr = np.asarray(img.GetDataBuffer())
img_data = np.copy(np.reshape(arr, (img.GetHeight(),img.GetWidth(),3)))