Wrapper Python OpenCV2 (cv2) pour obtenir la taille de l'image?

97

Comment obtenir la taille d'une image dans un cv2wrapper en Python OpenCV (numpy). Y a-t-il une manière correcte de faire cela autre que numpy.shape(). Comment puis-je l'obtenir dans ces formats de dimensions: (largeur, hauteur) liste?

xercool
la source
1
numpy.shapen'est pas appelable. C'est juste une plaine tuple. Malheureusement, il peut être long de 3 ou 2 éléments.
Tomasz Gandor

Réponses:

210

cv2utilise numpypour manipuler les images, donc la meilleure et la meilleure façon d'obtenir la taille d'une image est d'utiliser numpy.shape. En supposant que vous travaillez avec des images BGR, voici un exemple:

>>> import numpy as np
>>> import cv2
>>> img = cv2.imread('foo.jpg')
>>> height, width, channels = img.shape
>>> print height, width, channels
  600 800 3

Dans le cas où vous travailliez avec des images binaires, imgaura deux dimensions, et vous devez donc changer le code en:height, width = img.shape

jabaldonedo
la source
23
Oh, allez. Au lieu de supposer que l'image sera BGR ou mono, écrivez simplement en général - h, w = img.shape[:2], d'autant plus que l'OP n'est pas intéressé par la profondeur. (Moi non plus). Voir ma réponse pour plus de détails.
Tomasz Gandor
19

J'ai peur qu'il n'y ait pas de «meilleure» façon d'obtenir cette taille, mais ce n'est pas si douloureux.

Bien sûr, votre code doit être sûr pour les images binaires / mono ainsi que pour les images multi-canaux, mais les principales dimensions de l'image viennent toujours en premier dans la forme du tableau numpy. Si vous optez pour la lisibilité, ou si vous ne voulez pas vous donner la peine de taper ceci, vous pouvez l'envelopper dans une fonction et lui donner un nom que vous aimez, par exemple cv_size:

import numpy as np
import cv2

# ...

def cv_size(img):
    return tuple(img.shape[1::-1])

Si vous êtes sur un terminal / ipython, vous pouvez également l'exprimer avec un lambda:

>>> cv_size = lambda img: tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)

Écrire des fonctions avec defn'est pas amusant tout en travaillant de manière interactive.

Éditer

À l'origine, je pensais que l'utilisation [:2]était OK, mais la forme numpy l'est (height, width[, depth]), et nous avons besoin (width, height), comme par exemple, cv2.resizeattend, donc - nous devons utiliser [1::-1]. Encore moins mémorable que [:2]. Et qui se souvient du tranchage inversé de toute façon?

Tomasz Gandor
la source
1
Peut-être pas très utile, mais vous pouvez également le découper commeimg.shape[:2][::-1]
billyjmc
13
Il n'y a aucune raison pour que vous soyez amoureux des deux points dans vos crochets d'index. return (image.shape [1], image.shape [0]) est à la fois succinct et lisible.
mcduffee