2

我正在使用 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)

$

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

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

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

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

4

1 回答 1

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))
于 2012-09-04T12:28:51.727 回答