在 python-opencv 中获取视频尺寸

Posted

技术标签:

【中文标题】在 python-opencv 中获取视频尺寸【英文标题】:Get video dimension in python-opencv 【发布时间】:2017-02-18 13:54:09 【问题描述】:

我可以得到图像的大小,像这样:

import cv2

img = cv2.imread('my_image.jpg',0)
height, width = img.shape[:2]

视频怎么样?

【问题讨论】:

你从视频中得到一帧,你有图像,所以你可以使用shape 【参考方案1】:

它将文件或相机的widthheight 提供为float(因此您可能必须转换为integer

但它总是给我0.0 FPS

import cv2

vcap = cv2.VideoCapture('video.avi') # 0=camera
 
if vcap.isOpened(): 
    # get vcap property 
    width  = vcap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)   # float `width`
    height = vcap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)  # float `height`
    # or
    width  = vcap.get(3)  # float `width`
    height = vcap.get(4)  # float `height`

    # it gives me 0.0 :/
    fps = vcap.get(cv2.cv.CV_CAP_PROP_FPS)

它似乎可以工作 fps = vcap.get(7) 但我只检查了一个文件。


EDIT 2019:目前cv2 使用的名称几乎没有什么不同

cv2.CAP_PROP_FRAME_WIDTH   # 3
cv2.CAP_PROP_FRAME_HEIGHT  # 4

cv2.CAP_PROP_FPS           # 5
cv2.CAP_PROP_FRAME_COUNT   # 7

但它们具有相同的值:3457

import cv2

#vcap = cv2.VideoCapture(0)  # built-in webcamera

vcap = cv2.VideoCapture('video.avi')

if vcap.isOpened(): 
    width  = vcap.get(cv2.CAP_PROP_FRAME_WIDTH)   # float `width`
    height = vcap.get(cv2.CAP_PROP_FRAME_HEIGHT)  # float `height`
    # or
    width  = vcap.get(3)  # float `width`
    height = vcap.get(4)  # float `height`

    print('width, height:', width, height)
    
    fps = vcap.get(cv2.CAP_PROP_FPS)
    # or
    fps = vcap.get(5)
    
    print('fps:', fps)  # float `fps`
    
    frame_count = vcap.get(cv2.CAP_PROP_FRAME_COUNT)
    # or
    frame_count = vcap.get(7)
    
    print('frames count:', frame_count)  # float `frame_count`

    #print('cv2.CAP_PROP_FRAME_WIDTH :', cv2.CAP_PROP_FRAME_WIDTH)   # 3
    #print('cv2.CAP_PROP_FRAME_HEIGHT:', cv2.CAP_PROP_FRAME_HEIGHT)  # 4
    #print('cv2.CAP_PROP_FPS         :', cv2.CAP_PROP_FPS)           # 5
    #print('cv2.CAP_PROP_FRAME_COUNT :', cv2.CAP_PROP_FRAME_COUNT)   # 7

EDIT 2020:How do I get usb webcam property IDs for OpenCV中的所有属性

【讨论】:

通过 CV_CAP_PROP_FRAME_WIDTH/CV_CAP_PROP_FRAME_HEIGHT 对我的文件工作正常,谢谢。 注意,cv2.cv.CV_* 命名空间现在已经过时了。只需参考cv2.* @furas 请参考***.com/questions/47882/…。在我看来,进入这个页面的大多数人不是专业的程序员,而是数据科学家或其他人。因而不会看出这其中的毛病。是的,这样写是可行的,但它会使代码不可读。这些名字是有原因的。 @furas 此外,I wanted to show all versions 不是有效的推理:您可以添加任意数量的width = vcap.get(3+1-1+1-1)。仍然有效,仍然是“一个版本”,显然不好。我并不是想成为一个刺头,只是希望人们使用正确的形式,因为没有人会阅读我们的 cmets。 3”没有真正的意义,也不是真正的整数。它是一个枚举,应该这样对待。【参考方案2】:
width = vcap.get(cv2.CAP_PROP_FRAME_WIDTH )
height = vcap.get(cv2.CAP_PROP_FRAME_HEIGHT )
fps =  vcap.get(cv2.CAP_PROP_FPS)

width = vcap.get(3)
height = vcap.get(4)
fps = vcap.get(5)

【讨论】:

【参考方案3】:

对于 3.3.1 版本,方法发生了变化。检查此链接以了解更改:https://docs.opencv.org/3.3.1/d4/d15/group__videoio__flags__base.html#ga023786be1ee68a9105bf2e48c700294d

如果需要,请使用上面链接中的cv2.CAP_PROP_FRAME_WIDTH 和其他人,而不是cv2.cv.CV_CAP_PROP_FRAME_WIDTH

【讨论】:

【参考方案4】:
cv2.__version__
'3.4.3' 

w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

【讨论】:

【参考方案5】:

对于 OpenCV versions = 4.x.x:

    width  = vcap.get(cv2.CAP_PROP_FRAME_WIDTH)   
    height = vcap.get(cv2.CAP_PROP_FRAME_HEIGHT)  

【讨论】:

【参考方案6】:

虽然已解决的答案就在这里,但在 2021 年,情况发生了一些变化。 (OpenCV 版本 = 4.5.2

import cv2
cap = cv2.VideoCapture('video.mp4') #0 for camera


if cap.isOpened(): 
    width  = cap.get(cv2.CAP_PROP_FRAME_WIDTH)   # float `width`
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)  # float `height`
    fps = cap.get(cv2.CAP_PROP_FPS) # float `fps`
    total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT) # float `total_frame_in_the_video` (should not be applicable for camera)

【讨论】:

【参考方案7】:

您可以使用 vcap.get(i) 方法,其中 i 可以在 0 到 21 之间,根据 OpenCV docs。

【讨论】:

以上是关于在 python-opencv 中获取视频尺寸的主要内容,如果未能解决你的问题,请参考以下文章

Python-Opencv 在内存缓冲区上写入 x264 视频

通过python-opencv对视频逐帧截取

如何在 PHP 中获取视频时长、尺寸和大小?

在Angular 2中获取视频标签的源尺寸

基于python-opencv和PIL的截取视频区域生成 GIF 动图

在目标 c 中以编程方式获取视频的尺寸