如何在Python OpenCV (numpy cv2
包装器中获取图像的大小。除了numpy.shape()
之外,有没有正确的方法可以做到这一点.如何以以下格式尺寸获取它:(宽度、高度(列表?
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
怕没有"更好"的方法来获得这个大小,但是它并没有那么痛苦。
当然,您的代码对于二进制/单声道图像以及多通道图像都应该是安全的,但是图像的主要尺寸始终在numpy数组的形状中排在第一位。如果你选择可读性,或者不想费心输入这个,你可以把它包装在一个函数中,并给它一个你喜欢的名字,例如 cv_size
:
import numpy as np
import cv2
# ...
def cv_size(img):
return tuple(img.shape[1::-1])
如果你在终端/ipython上,你也可以用lambda来表达它:
>>> cv_size = lambda img: tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)
在交互式工作时,使用 def
编写函数并不有趣。
编辑
最初我认为使用 [:2]
是可以的,但是 numpy 形状是(height, width[, depth])
的,我们需要(width, height)
,例如 cv2.resize
期望,所以 - 我们必须使用[1::-1]
.甚至比[:2]
更难忘.反正谁还记得反向切片?
Python 3 元组解包
在我们全部迁移到 Python 3 之后,有了这个 https://peps.python.org/pep-3132/——我们也可以使用元组解压缩来获取h
和w
:
h, w, *_ = img.shape
这一次,我们不必担心单通道图像:)
import cv2
import numpy as np
def main():
# init cv
cap = cv2.VideoCapture(0)
while True:
success, img = cap.read()
# WAY 1
img = cv2.flip(img, 1)
print(img.shape)
# WAY 2
print(
f"width: {cap.get(cv2.CAP_PROP_FRAME_WIDTH)}, height: {cap.get(cv2.CAP_PROP_FRAME_HEIGHT)}, fps: {cap.get(cv2.CAP_PROP_FPS)}")
cv2.imshow(winname="universal control", mat=img)
cv2.waitKey(1)
if __name__ == '__main__':
main()