Відповіді:
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 елементи.