我使用的是Numpy和OpenCV2.4.1,我的IP摄像机有一个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)
$
我使用ctypes时,pBuffer的类型为POINTER(c_ubyte)。
我尝试获取YV12格式的pBuffer的Y通道,并将其放入Numpy数组中以供OpenCV处理。
但是,np.asarray()存在很大的瓶颈,获取帧数据并将其放入3D numpy数组(高度,宽度,通道)花费的时间太长。我已经测试过pBuffer的指针访问操作用于将Y数据切出不是瓶颈。在具有4GB内存的双核计算机上,此回调只能以每秒3帧的速度运行。如果没有np.asarray()操作,则回调可以每秒30帧的速度运行。
请建议一种方法,以便将pBuffer数据放入3D numpy数组中,该数组足够快速以每秒获得30帧。
最佳答案
如果您不需要复制数据(即您的回调将对其进行处理然后将其丢弃),则可以直接使用缓冲区构造数组:
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))