2012-11-05 14 views
21

opencvのpythonバインディングであるcv2を使用して画像にフィルタを適用しようとしています。ここでは何であるかのように私のコードを見て:"システムエラー:新しい形式のgetargs形式ですが、引数がタプルではありません" cv2.blurを使用している場合

im = cv2.imread('./test_imgs/zzzyj.jpg') 
cv2.imshow('Image', cv2.blur(im, 2) 
cv2.waitKey(0) 

それはほとんどコピー&ペーストdocumentationからです。しかし、それだけでこのメッセージを超えないトレースと、動作しません:

SystemError: new style getargs format but argument is not a tuple 

同じエラーがmedianBlurでGaussianBlurで発生しますが、ありません。何かご意見は?

答えて

21

cv2.blurの場合、(2,2)のような2つの要素のタプルとしてksizeを与える必要があります。しかし、medianBlurでは、ksize = 3で十分です。そこから四角いカーネルが差し引かれます。

したがって、このようなコードを作る:

im = cv2.imread('./test_imgs/zzzyj.jpg') 
cv2.imshow('Image', cv2.blur(im, (3,3))) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

が、それは動作しますホープ!

+0

(2,2)は、それはモジュロ1 –

6

2.8.1から4.1.0にアップグレードすると同じ問題が発生しました。ここで

Pillow==4.1.0を実行しているときに例外が発生しますサンプルコードの一部です:

from PIL import Image 
img = Image.new('RGBA', [100,100]) 
# An empty mask is created to later overlay the original image (img) 
mask = Image.new('L', img.size, 255) 
# Get transparency (mask) layer pixels, they will be changed! 
data = mask.load() 
# The function used later 
def foo(x,y): return round(1.0*x/(y+1)) 
# Update all pixels in the mask according to some function (foo) 
for x in range(img.size[0]): 
    for y in range(img.size[1]): 
     data[x,y] = foo(x,y) 

出力:

Traceback (most recent call last): 
    File "x.py", line 12, in <module> 
    data[x,y] = foo(x,y) 
SystemError: new style getargs format but argument is not a tuple 

ここで実際のエラーが記載されている何を行うには何もを持っていません例外的に。実際には、データに割り当てられたデータのタイプが間違っています。だから、foo上記の例では次のように再定義することができ

data[x,y]=1 
data[x,y]=int(1.0) 

4.1.0にあなたがこのいずれかのような整数を使用するが必要ながらdata[x,y]=1.0のようなものが、有効であるよう2.8.1intfloatの両方が、有効です2.8.14.1.0の両方で動作するように:。

def foo(x,y): return int(round(1.0*x/(y+1))) 
+1

うん、ほとんどの1を分割何かする必要があります動作しません。私が見た誤解を招くエラーメッセージ - かなりイライラします。 – Simon

関連する問題