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