2012-11-05 8 views
21

Po prostu próbuję zastosować filtr do obrazu za pomocą cv2, Python opencv powiązań. Oto co mój kod wygląda tak:"Błąd systemu: nowy styl w formacie getargs, ale argument nie jest krotką" przy użyciu cv2.blur

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

To prawie skopiuj i wklej z documentation. Jednakże, to po prostu nie działa, nie więcej niż ślad tej wiadomości:

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

Ten sam błąd występuje z GaussianBlur, ale nie z medianBlur. jakieś pomysły?

Odpowiedz

21

Dla cv2.blur, musisz podać ksize jako krotkę dwóch elementów, takich jak (2,2). Ale dla medianBlur wystarczy ksize = 3. Odejmie od niej kwadratowe jądro.

Więc uczynić kod tak:

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

nadzieję, że to działa !!!

+0

(2,2) nie działa, to musi być coś, co dzieli modulo 1 –

6

Mam ten sam problem, gdy zaktualizowano poduszkę z 2.8.1 na 4.1.0.

Oto kawałek przykład kodu, który wygeneruje wyjątek, gdy uruchomiony 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) 

wyjściowa:

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 

Rzeczywisty błąd tutaj ma nic z tym, co jest powiedziane w wyjątku. W rzeczywistości jest to typ danych przypisanych do danych, które są błędne. W 2.8.1 zarówno int i float są ważne, więc takie rzeczy jak data[x,y]=1.0 jest ważna, natomiast w 4.1.0 ty potrzeba używać liczb całkowitych jak nic z tego:

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

Tak więc w powyższym przykładzie foo może być na nowo do następujących pracować zarówno 2.8.1 i 4.1.0.

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

Tak, jedną z najbardziej wprowadzające w błąd komunikaty o błędach, które widziałem - dość frustrujące. – Simon

Powiązane problemy