我使用的是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))

10-08 16:05