Câu trả lời:
cv2
sử dụng numpy
để xử lý hình ảnh, vì vậy, cách thích hợp và tốt nhất để có được kích thước của hình ảnh đang sử dụng numpy.shape
. Giả sử bạn đang làm việc với hình ảnh BGR, đây là một ví dụ:
>>> import numpy as np
>>> import cv2
>>> img = cv2.imread('foo.jpg')
>>> height, width, channels = img.shape
>>> print height, width, channels
600 800 3
Trong trường hợp bạn đang làm việc với hình ảnh nhị phân, img
sẽ có hai chiều và do đó bạn phải thay đổi mã thành:height, width = img.shape
h, w = img.shape[:2]
, đặc biệt là OP không quan tâm đến độ sâu. (Không phải là tôi). Xem câu trả lời của tôi để biết thêm chi tiết.
Tôi e rằng không có cách nào "tốt hơn" để có được kích thước này, tuy nhiên nó không quá đau.
Tất nhiên mã của bạn phải an toàn cho cả hình ảnh nhị phân / đơn sắc cũng như hình ảnh đa kênh, nhưng kích thước chính của hình ảnh luôn đứng đầu trong hình dạng của mảng numpy. Nếu bạn chọn tính dễ đọc, hoặc không muốn nhập cái này, bạn có thể gói nó trong một hàm và đặt cho nó một cái tên bạn thích, ví dụ cv_size
:
import numpy as np
import cv2
# ...
def cv_size(img):
return tuple(img.shape[1::-1])
Nếu bạn đang sử dụng terminal / ipython, bạn cũng có thể thể hiện nó bằng lambda:
>>> cv_size = lambda img: tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)
Viết hàm với def
không phải là thú vị khi làm việc tương tác.
Biên tập
Ban đầu tôi nghĩ rằng sử dụng [:2]
là OK, nhưng hình dạng numpy là (height, width[, depth])
, và chúng ta cần (width, height)
, ví dụ như cv2.resize
mong đợi, vì vậy - chúng ta phải sử dụng [1::-1]
. Thậm chí ít đáng nhớ hơn [:2]
. Và ai còn nhớ phép cắt ngược?
img.shape[:2][::-1]
numpy.shape
không thể gọi được. Nó chỉ là một đồng bằngtuple
. Thật không may, nó có thể dài 3 hoặc 2 phần tử.