4

Cythonを使用してUSBカメラから画像を取得し、発信者に返されるPIL画像に変換しています。

画像のデータは、画像取得関数によって返される構造体の「convert_buffer」メンバーが指す文字配列にあります。

struct FlyCaptureImage:
   /// stuff
  char * convert_buffer
   /// more stuff

現在、これを実行してPILイメージに変換しています。

cdef unsigned char *convert_buffer
cdef Py_ssize_t byte_length
cdef bytes py_string

// get the number of bytes into a Py_ssize_t type
byte_length = count

// slice the char array so it looks like a Python str type
py_string = convert_buffer[:byte_length]

// create the PIL image from the python string
pil_image = PILImage.fromstring('RGB', (width, height), py_string)

データをPython文字列に変換するこの手順では、ゼロコピーイベントのように聞こえるまでに2ミリ秒かかります。カメラAPIが提供するchar*画像データポインタからPILに画像を作成させることは可能ですか?

4

2 に答える 2

3

PIL 1.1.4以降、このImage.frombufferメソッドはゼロコピーをサポートしています。

標準の「raw」デコーダを使用して、文字列またはバッファオブジェクトのピクセルデータから画像メモリを作成します。一部のモードでは、イメージメモリは元のバッファとメモリを共有します(これは、元のバッファオブジェクトへの変更がイメージに反映されることを意味します)。すべてのモードがメモリを共有できるわけではありません。サポートされているモードには、「L」、「RGBX」、「RGBA」、および「CMYK」が含まれます。

問題は、カメラデータが24ビットRGBであるように見えることです。ここで、PILは32ビットRGBA/RGBXを必要とします。カメラAPIからのピクセルフォーマットを制御できますか?

そうでない場合でも、ピクセルデータからPython文字列を作成する必要Image.frombufferはなく、を受け入れるので、を使用することには利点があります。buffer

編集:のソースを見るとfrombuffer、それは上の軽いラッパーでfromstringあり、ゼロコピーにはImage._MAPMODESリスト内のピクセル形式(つまりRGBX)が必要です。少なくとも、ゼロコピー互換のピクセル形式を取得するには、RGBデータをRGBXバッファーにコピー/変換する必要があります。

生のバイトをPILに取り込むためのより良い方法はありませんが、ここにいくつかの興味深い参考資料があります。

于 2012-06-26T14:26:39.993 に答える
0

たぶん、行く方法は、Python文字列またはarray.arrayオブジェクトを手動でアセンブルすることです-そのためのC構造体を使用し、バッファをデータにポイントします。まったく必要なかったので、コードを書くところまでは行きませんでした。

確認したところ、文字列では不可能です。文字列本体は、文字列オブジェクトヘッダーを使用して単一の部分に割り当てる必要があります(メモリの別のチャンクへのポインタはありません)。

于 2013-01-22T14:00:37.540 に答える