Відповіді:
cv2використовується numpyдля маніпулювання зображеннями, тому використовується правильний та найкращий спосіб отримати розмір зображення numpy.shape. Якщо припустити, що ви працюєте з зображеннями BGR, ось приклад:
>>> import numpy as np
>>> import cv2
>>> img = cv2.imread('foo.jpg')
>>> height, width, channels = img.shape
>>> print height, width, channels
600 800 3
Якщо ви працювали з двійковими зображеннями, imgвони матимуть два виміри, тому вам слід змінити код на:height, width = img.shape
h, w = img.shape[:2]тим більше, що OP не цікавить глибина. (Я теж не був). Докладніше див. У моїй відповіді.
Я боюся, що немає "кращого" способу отримати такий розмір, однак це не такий великий біль.
Звичайно, ваш код повинен бути безпечним як для двійкових / моно зображень, так і для багатоканальних, але основні розміри зображення завжди стоять на першому місці у формі масиву numpy. Якщо ви обираєте читабельність або не хочете турбуватись надрукуванням цього, ви можете обернути його у функцію та назвати вподобане ім’я, наприклад cv_size:
import numpy as np
import cv2
# ...
def cv_size(img):
return tuple(img.shape[1::-1])
Якщо ви перебуваєте на терміналі / ipython, ви також можете висловити це за допомогою лямбда:
>>> cv_size = lambda img: tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)
Запис функцій за допомогою defінтерактивної роботи не приносить задоволення.
Редагувати
Спочатку я думав, що використовувати [:2]нормально, але фігурна форма є (height, width[, depth]), і нам потрібно (width, height), як, наприклад, cv2.resizeочікується, тому - ми повинні використовувати [1::-1]. Навіть менш запам'ятовується, ніж [:2]. А хто взагалі пам’ятає зворотну нарізку?
img.shape[:2][::-1]
numpy.shapeне викликається. Це просто рівнинаtuple. На жаль, він може мати довжину 3 або 2 елементи.