7

私はから来たnumpy配列を持っているcv2.imreadので、とも持っdtype = np.uint8ていndim = 3ます。

unsigned int*外部のcppライブラリで使用するためにCythonに変換したいと思います。

試しcdef unsigned int* buff = <unsigned int*>im.dataていますが、エラーが発生しますPython objects cannot be cast to pointers of primitive types

私は何が間違っているのですか?

ありがとう

4

2 に答える 2

9

より現代的な方法は、ポインタではなくメモリビューを使用することです。

cdef np.uint32_t[:,:,::1] mv_buff = np.ascontiguousarray(im, dtype = np.uint32)

この[:,;,::1]構文は、Cythonにメモリビューがメモリ内で3DおよびC連続であることを示しています。タイプをnumpy配列ではなくmemoryviewとして定義することの利点は次のとおりです。

  1. 組み込みのアレイモジュールやPILイメージングライブラリのオブジェクトなど、バッファインターフェイスを定義する任意のタイプを受け入れることができます。
  2. GILを保持せずにメモリビューを渡すことができます。これは並列コードに役立ちます

memoryviewからポインタを取得するには、最初の要素のアドレスを取得します。

cdef np.uint32_t* im_buff = &mv_buff[0,0,0]

<np.uint32_t*>mv_buff.dataこれはキャストを回避するため、実行するよりも優れています。キャストはエラーを隠すことがよくあります。

于 2019-02-22T17:27:59.650 に答える
8

コメントしてくれてありがとう。解決策:

cdef np.ndarray[np.uint32_t, ndim=3, mode = 'c'] np_buff = np.ascontiguousarray(im, dtype = np.uint32)
cdef unsigned int* im_buff = <unsigned int*> np_buff.data
于 2012-05-24T10:35:07.777 に答える