2016-04-24 47 views
2

我使用Win32gui从窗口截图创建了一个图像。对象的类型是:用OpenCV读取PyCBitmap

object 'PyCBitmap' - assoc is 000002AF9A64DB50, vi=<None> 

我想,然后通过这个用OpenCV的分析。我已经成功使用保存的.bmp文件阅读:

cv2.imread(img_file, 0) 

当使用cv2.imread的PyCBitmap对象我碰到下面的错误尝试:

TypeError: bad argument type for built-in operation 

我的问题是:

如何我可以将PyCBitmap对象转换为cv2.imread的可接受类型,而不必首先将对象保存为.bmp文件?

由于提前,

Behzad我使用的OpenCV 3.1 Python绑定

ps的,我很高兴能跟随建议写在C++或Python :)

回答

0

我一直在寻找同样的事情,我终于找到了结合其他几个SO答案:

基本上,我想出了代码:

import PIL, numpy, cv2 
bmpinfo = dataBitMap.GetInfo() 
bmparray = numpy.asarray(dataBitMap.GetBitmapBits(), dtype=numpy.uint8) 
pil_im = Image.frombuffer('RGB', (bmpinfo['bmWidth'], bmpinfo['bmHeight']), bmparray, 'raw', 'BGRX', 0, 1) 
pil_array = numpy.array(pil_im) 
cv_im = cv2.cvtColor(pil_array, cv2.COLOR_RGB2BGR) 

简要说明:Python的OpenCV的只是使用numpy的阵列,这样的伎俩确实是越来越字节到正确numpy的阵列格式。事实证明,为此,您需要像PIL这样的图像处理库,可以处理特定于图像的逻辑,如剪切alpha通道。输入数据通常为RGBX格式,PIL转换为RGB,OpenCV将其转换为它喜欢的BGR。

我对此进行了剖析,不幸的是它比GetBitmapBits()慢并​​将其元组结果转换为数组。