2012-09-04 96 views
2

我使用numpy的和OpenCV2.4.1,我的IP攝像機具有通過一個回調函數返回的圖片緩存的SDK。 簡化功能如下:numpy的數組運算太慢np.asarray()

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) 

$

p緩衝器是POINTER(c_ubyte)型作爲我使用ctypes的。

我試圖獲取p緩衝器,這是在YV12格式的Y通道,並把它放入一個numpy的陣OpenCV的處理。

然而,在np.asarray()的一大瓶頸,需要花費太長獲取幀數據並放入3D numpy的陣列(高度,寬度,信道)。我已經測試過pBuffer的指針訪問操作來切出Y數據不是瓶頸。這個回調只能在4GB RAM的雙核心計算機上以每秒3幀的速度運行。沒有np.asarray()操作,回調可以以每秒30幀的速度運行。

請建議的方法,以便把p緩衝器數據轉換成3D numpy的陣列,它是速度不夠快就得到每秒30幀。

回答

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)) 
+0

太謝謝你了!現在它快得多〜 –