Respuestas:
cv2
utiliza numpy
para manipular imágenes, por lo que la mejor y más adecuada forma de obtener el tamaño de una imagen es utilizando numpy.shape
. Suponiendo que está trabajando con imágenes BGR, aquí hay un ejemplo:
>>> import numpy as np
>>> import cv2
>>> img = cv2.imread('foo.jpg')
>>> height, width, channels = img.shape
>>> print height, width, channels
600 800 3
En caso de que estuvieras trabajando con imágenes binarias, img
tendrá dos dimensiones, y por lo tanto deberás cambiar el código a:height, width = img.shape
h, w = img.shape[:2]
, especialmente porque el OP no está interesado en la profundidad. (Ni yo). Vea mi respuesta para más detalles.
Me temo que no hay una forma "mejor" de conseguir este tamaño, sin embargo, no es tanto dolor.
Por supuesto, su código debe ser seguro tanto para imágenes binarias / mono como para multicanal, pero las dimensiones principales de la imagen siempre son lo primero en la forma de la matriz numpy. Si opta por la legibilidad, o no quiere molestarse en escribir esto, puede envolverlo en una función y darle un nombre que le guste, por ejemplo cv_size
:
import numpy as np
import cv2
# ...
def cv_size(img):
return tuple(img.shape[1::-1])
Si está en una terminal / ipython, también puede expresarlo con una lambda:
>>> cv_size = lambda img: tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)
Escribir funciones con def
no es divertido mientras se trabaja de forma interactiva.
Editar
Originalmente pensé que usarlo [:2]
estaba bien, pero la forma numpy lo es (height, width[, depth])
, y necesitamos (width, height)
, como por ejemplo cv2.resize
, espera, así que debemos usar [1::-1]
. Incluso menos memorable que [:2]
. ¿Y quién recuerda el corte inverso de todos modos?
img.shape[:2][::-1]
numpy.shape
no es invocable. Es simplemente un llanotuple
. Desafortunadamente, puede tener 3 o 2 elementos.