Respostas:
cv2
usa numpy
para manipular imagens, portanto, a melhor e mais adequada maneira de obter o tamanho de uma imagem é usando numpy.shape
. Supondo que você esteja trabalhando com imagens BGR, aqui está um exemplo:
>>> import numpy as np
>>> import cv2
>>> img = cv2.imread('foo.jpg')
>>> height, width, channels = img.shape
>>> print height, width, channels
600 800 3
Caso você esteja trabalhando com imagens binárias, img
terá duas dimensões e, portanto, deverá alterar o código para:height, width = img.shape
h, w = img.shape[:2]
, especialmente porque o OP não está interessado na profundidade. (Nem eu estava). Veja minha resposta para mais detalhes.
Receio que não haja maneira "melhor" de obter esse tamanho, no entanto, não é muito doloroso.
É claro que seu código deve ser seguro tanto para imagens binárias / mono quanto para imagens multicanais, mas as dimensões principais da imagem sempre vêm em primeiro lugar na forma do array numpy. Se você optar pela legibilidade, ou não quiser se preocupar em digitar isso, pode embrulhar em uma função e dar a ela um nome que você goste, por exemplo cv_size
:
import numpy as np
import cv2
# ...
def cv_size(img):
return tuple(img.shape[1::-1])
Se você estiver em um terminal / ipython, também poderá expressá-lo com um lambda:
>>> cv_size = lambda img: tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)
Escrever funções com def
não é divertido ao trabalhar interativamente.
Editar
Originalmente, pensei que usar [:2]
estava OK, mas a forma numpy é (height, width[, depth])
, e precisamos (width, height)
, como por exemplo cv2.resize
, espera, então - devemos usar [1::-1]
. Ainda menos memorável do que [:2]
. E quem se lembra do corte reverso?
img.shape[:2][::-1]
numpy.shape
não é exigível. É apenas uma planícietuple
. Infelizmente, pode ter 3 ou 2 elementos.