Numpy数组操作太慢np.asarray()

时间:2012-09-04 12:10:40

标签: python arrays pointers opencv numpy

我正在使用Numpy和OpenCV2.4.1,我的IP Camera有一个SDK,它通过回调函数返回图片缓冲区。 简化的功能如下:

def py_fDecodeCallBack(lPort, pBuffer, lSize, pFrameInfo, lReserved1, lReserved2):
    frameInfo = pFrameInfo.contents
    pBufY = np.asarray( pBuffer[:frameInfo.lHeight*frameInfo.lWidth],dtype=np.uint8).reshape(frameInfo.lHeight,frameInfo.lWidth, 1)

$

pBuffer属于POINTER(c_ubyte)类型,因为我正在使用ctypes。

我尝试获取pBuffer的Y通道,该通道采用YV12格式,并将其放入Numpy Array中供OpenCV处理。

然而,np.asarray()存在很大的瓶颈,获取帧数据并放入3D numpy数组(高度,宽度,通道)需要很长时间。我已经测试了pBuffer的指针访问操作,用于切割Y数据不是瓶颈。此回调只能在具有4GB内存的双核计算机上以每秒3帧的速度运行。如果没有np.asarray()操作,回调可以以每秒30帧的速度运行。

请建议一种方法,以便将pBuffer数据放入3D numpy数组中,该数组足够快,每秒可以获得30帧。

1 个答案:

答案 0 :(得分:3)

如果您不需要复制数据(即您的回调将处理它然后丢弃它),您可以直接使用缓冲区构建数组:

array = (ctypes.c_ubyte * frameInfo.lHeight * frameInfo.lWidth * 1
          ).from_address(ctypes.addressof(pBuffer.contents))
pBufY = np.ndarray(buffer=array, dtype=np.uint8,
                   shape=(frameInfo.lHeight, frameInfo.lWidth, 1))