web-dev-qa-db-fra.com

"Erreur système: nouveau format getargs de style mais l'argument n'est pas un tuple" lors de l'utilisation de cv2.blur

J'essaie juste d'appliquer un filtre à une image en utilisant cv2, les liaisons opencv python. Voici à quoi ressemble mon code:

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

C'est presque du copier-coller de la documentation . Cependant, cela ne fonctionne tout simplement pas, avec pas plus de trace que ce message:

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

La même erreur se produit avec GaussianBlur, mais pas avec medianBlur. Des pensées?

29
Antonio Dourado

Pour cv2.blur, vous devez donner ksize comme un tuple de deux éléments, comme (2,2). Mais pour medianBlur, ksize = 3 est suffisant. Il en déduira un noyau carré.

Faites donc du code comme ceci:

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

J'espère que cela fonctionnera !!!

30
Abid Rahman K

J'ai le même problème quand mise à niveau de Pillow from 2.8.1 à 4.1.0.

Voici un exemple de code qui générera l'exception lors de l'exécution de 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)

Production:

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

L'erreur réelle ici a rien à voir avec ce qui est indiqué dans l'exception. C'est en fait le type de données affectées aux données qui est erroné. Dans 2.8.1 les deux int et float sont valides, donc des choses comme data[x,y]=1.0 est valide, tandis que dans 4.1.0 vous besoin pour utiliser des entiers comme celui-ci:

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

Ainsi, dans l'exemple ci-dessus, foo pourrait être redéfini comme suit pour fonctionner dans les deux 2.8.1 et 4.1.0 .:

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