我正在使用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帧。
答案 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))