在 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】:
它将文件或相机的width
和height
提供为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
但它们具有相同的值:3
、4
、5
、7
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 视频