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

Posted

技术标签:

【中文标题】Python OpenCV2(cv2)包装器获取图像大小?【英文标题】:Python OpenCV2 (cv2) wrapper to get image size? 【发布时间】:2013-10-06 13:05:38 【问题描述】:

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

【问题讨论】:

numpy.shape 不可调用。这只是一个普通的tuple。不幸的是,它可以是 3 或 2 个元素长。 【参考方案1】:

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

【讨论】:

哦,来吧。不要假设图像将是 BGR 或单声道,而是一般地写 - h, w = img.shape[:2],特别是因为 OP 对深度不感兴趣。 (我也不是)。有关详细信息,请参阅我的答案。 我觉得这很有帮助:docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/… 如果你只对高度和宽度感兴趣,@TomaszGandor 的评论更 Python 的替代品是 python h, w, _ = img.shape 【参考方案2】:

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

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

【讨论】:

可能不是很有帮助,但您也可以将其切片为img.shape[:2][::-1] 没有理由一定要爱上索引括号中的冒号。 return (image.shape[1], image.shape[0]) 简洁易读。 使用通配符解包:h, w, _ = image.shape【参考方案3】:
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()

【讨论】:

以上是关于Python OpenCV2(cv2)包装器获取图像大小?的主要内容,如果未能解决你的问题,请参考以下文章

在openCV2 Python中绘制convexHull

Pythonpython2.7 安装配置OpenCV2

如何使用 python opencv2 在 Windows 中的图像上写入文本

在open cv2 python中使用Tensor flow 2.0对象的方法是啥,为啥这么迂回?

python如何获取图某一点的灰度

python 使用此包装器而不是崩溃从函数中获取默认输出。