Python OpenCV2(cv2)包装器来获取图像大小?

如何在 PythonOpenCV (numpy)中获得 cv2包装器中的图像大小。除了 numpy.shape()以外,还有其他正确的方法吗。我如何得到它在这些格式尺寸: (宽度,高度)列表?

357913 次浏览

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

恐怕没有“更好”的方法来得到这种尺寸,但它不是那么痛苦。

当然,您的代码对于二进制/单进制图像以及多通道图像都应该是安全的,但是图像的主要尺寸总是以麻木数组的形状排在第一位。如果你选择可读性,或者不想麻烦输入这个,你可以把它包装在一个函数中,并给它一个你喜欢的名字,例如 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]是可以的,但是数字形状是 (height, width[, depth]),我们需要 (width, height),例如 cv2.resize期望,所以-我们必须使用 [1::-1]。比 [:2]还难忘。谁还记得反向切片呢?

Python3元组解包

在我们都转移到 Python 3之后,就有了这个 https://peps.python.org/pep-3132/——我们还可以通过使用 tuple 解包来获得 hw:

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()