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)

$

私はctypesを使用しているため、pBufferはPOINTER(c_ubyte)タイプです。

YV12 形式の pBuffer の Y チャネルを取得し、それを OpenCV で処理するために Numpy Array に入れようとしました。

ただし、np.asarray() には大きなボトルネックがあり、フレーム データを取得して 3D numpy 配列 (高さ、幅、チャネル) に配置するのに時間がかかりすぎます。Yデータを切り出すためのpBufferのポインタアクセス操作がボトルネックにならないことをテストしました。このコールバックは、4GB の RAM を搭載したデュアル コア コンピューターでは、毎秒 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 に答える