126

cv2如何在 Python OpenCV(numpy)的包装器中获取图像的大小。除了numpy.shape(). 如何以这些格式尺寸获得它:(宽度,高度)列表?

4

3 回答 3

270

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

于 2013-09-30T15:37:37.307 回答
23

恐怕没有“更好”的方法来获得这个尺寸,但这并没有那么痛苦。

当然,您的代码对于二进制/单声道图像和多通道图像都应该是安全的,但是图像的主要尺寸始终位于 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]. 谁还记得反向切片?

于 2015-01-09T23:40:48.987 回答
0
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()

于 2021-09-06T14:10:31.077 回答