12

(Python で) OpenCV を使用して画像処理を行いたいのですが、PILImageオブジェクトから開始するcvLoadImage()必要があるため、ファイル名を使用するため、呼び出しを使用できません。

このレシピ ( http://opencv.willowgarage.com/wiki/PythonInterfaceから適応) は動作しませcvSetDataargument 2 of type 'void *'。何か案は?

from opencv.cv import *
from PIL import Image

pi = Image.open('foo.png')                       # PIL image
ci = cvCreateImage(pi.size, IPL_DEPTH_8U, 1)     # OpenCV image
data = pi.tostring()
cvSetData(ci, data, len(data)) 

への最後の引数cvSetDataも間違っていると思いますが、どうあるべきかわかりません。

4

4 に答える 4

9

適応しようとした例は、OpenCV 2.0 の新しい python インターフェイス用です。cv.cvSetData()これはおそらく、接頭辞付きの関数名と接頭辞なしの関数名 (対)の間の混乱の原因ですcv.SetData()

OpenCV 2.0 には、2 セットの Python バインディングが同梱されています。

エラー メッセージの背後にある理由は、SWIG ラッパーが Python 文字列から従来の C バッファへの変換を処理しないためです。ただし、SWIG ラッパーにはモジュールが付属しており、これは OpenCV からのイメージと OpenCV へのイメージopencv.adaptorsの変換をサポートするように設計されています。numpyPIL

次の (テスト済みの) コードは、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バイト)。

于 2009-10-30T20:06:55.823 に答える
4

swigと新しいpythonバインディングの両方があるのは本当に混乱します。たとえば、OpenCV 2.0では、cmakeはBUILD_SWIG_PYTHON_SUPPORTとBUILD_NEW_PYTHON_SUPPORTの両方を受け入れることができます。しかしとにかく、私はちょっと落とし穴を理解しました。

「importcv」(新しいPythonバインディング)を使用する場合は、もう1つの手順が必要です。

cv.SetData(cv_img, pil_img.tostring(), pil_img.size[0]*3)
cv.CvtColor(cv_img, cv_img, cv.CV_RGB2BGR)

PILとIplImageではシーケンスが異なるため、RGB画像の場合は変換が必要です。同じことがIplからPILにも当てはまります。

ただし、opencv.adaptorsを使用する場合は、すでに処理されています。興味があれば、adaptors.pyで詳細を調べることができます。

于 2010-03-27T05:14:48.720 に答える
3

OpenCV2.1 の python2.6 バインディングを使用してこれを行いました。

    ...
    cv_img = cv.CreateImageHeader(img.size, cv.IPL_DEPTH_8U, 3)
    cv.SetData(cv_img, img.rotate(180).tostring()[::-1])
    ...

文字列の画像の回転と反転は、RGB を OpenCV ビデオ エンコーディングで使用される BGR にスワップすることです。これは、PIL から OpenCV に変換されたイメージを他の用途に使用する場合にも必要になると思います。

于 2010-09-07T09:31:52.970 に答える
0

私は専門家ではありませんが、次のコードで PIL イメージから opencv イメージを取得できました。

import opencv

img = opencv.adaptors.PIL2Ipl(pilimg)
于 2012-08-20T03:53:00.403 に答える