Réponses:
cv2
utilise numpy
pour 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, img
aura deux dimensions, et vous devez donc changer le code en:height, width = img.shape
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.
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 def
n'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.resize
attend, donc - nous devons utiliser [1::-1]
. Encore moins mémorable que [:2]
. Et qui se souvient du tranchage inversé de toute façon?
img.shape[:2][::-1]
numpy.shape
n'est pas appelable. C'est juste une plainetuple
. Malheureusement, il peut être long de 3 ou 2 éléments.