適応しようとした例は、OpenCV 2.0 の新しい python インターフェイス用です。cv.cvSetData()
これはおそらく、接頭辞付きの関数名と接頭辞なしの関数名 (対)の間の混乱の原因ですcv.SetData()
。
OpenCV 2.0 には、2 セットの Python バインディングが同梱されています。
エラー メッセージの背後にある理由は、SWIG ラッパーが Python 文字列から従来の C バッファへの変換を処理しないためです。ただし、SWIG ラッパーにはモジュールが付属しており、これは OpenCV からのイメージと OpenCV へのイメージopencv.adaptors
の変換をサポートするように設計されています。numpy
PIL
次の (テスト済みの) コードは、SWIG インターフェイスを使用して、元の問題 (PIL から OpenCV への変換) を解決するはずです。
# PIL to OpenCV using the SWIG wrapper
from opencv import cv, adaptors, highgui
import PIL
pil_img = PIL.Image.open(filename)
cv_img = adaptors.PIL2Ipl(pil_img)
highgui.cvNamedWindow("pil2ipl")
highgui.cvShowImage("pil2ipl", cv_img)
cv.cvSetData()
ただし、これは関数が常に失敗するという事実を解決しません (現在の SWIG ラッパー実装では)。cv.SetData()
次に、期待どおりに関数を使用できる新しいスタイルのラッパーを使用できます。
# PIL to OpenCV using the new wrapper
import cv
import PIL
pil_img = PIL.Image.open(filename)
cv_img = cv.CreateImageHeader(pil_img.size, cv.IPL_DEPTH_8U, 3) # RGB image
cv.SetData(cv_img, pil_img.tostring(), pil_img.size[0]*3)
cv.NamedWindow("pil2ipl")
cv.ShowImage("pil2ipl", cv_img)
3 番目のアプローチは、OpenCV python インターフェイスをctypes ベースの wrapper に切り替えることです。Python 文字列と C バッファなどの間の明示的なデータ変換のためのユーティリティ関数が付属しています。Googleコード検索をざっと見てみると、これが有効な方法であることがわかります。
関数の 3 番目のパラメーターについてはcvSetData()
、画像バッファーのサイズですが、画像のステップです。ステップは、画像の 1 行のバイト数であり、pixel_depth * number_of_channels * image_width
. pixel_depth
パラメータは、1 つのチャネルに関連付けられたデータのバイト単位のサイズです。あなたの例では、それは単に画像の幅になります(1つのチャネルのみ、ピクセルあたり1バイト)。