Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用OpenCV和Python计算视频中的总帧数

使用OpenCV和Python计算视频中的总帧数

作者头像
周旋
发布于 2020-10-23 07:02:26
发布于 2020-10-23 07:02:26
3.8K00
代码可运行
举报
文章被收录于专栏:行走的机械人行走的机械人
运行总次数:0
代码可运行

本文来自光头哥哥的博客【Count the total number of frames in a video with penCV and Python】,仅做学习分享。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
原文链接:https://www.pyimagesearch.com/2017/01/09/count-the-total-number-of-frames-in-a-video-with-opencv-and-python/

一个读者的问题:

我需要用OpenCV计算视频文件中帧的总数。我发现的唯一的方法是对视频文件中的每一帧逐个循环,并增加一个计数器。有更快的方法吗?

在使用OpenCV和Python处理视频文件时,有两种方法来确定帧的总数:

  • 方法1:使用OpenCV提供的内置属性访问视频文件元信息并返回帧总数的快速、高效的方法。
  • 方法2:缓慢、低效的方法,需要我们手动循环每一帧,并为我们读的每一帧增加一个计数器。

方法1显然是理想的。 我们所需要做的就是打开视频文件的指针,告诉OpenCV我们感兴趣的元属性,并获得返回值。

不用手动循环所有帧。 不用浪费的CPU来循环解码。 但是有一个问题,因为OpenCV版本不同和安装的视频编解码器的多样性,导致方法1有很多bug。

你会发现在某些情况下,超过一半的.get和.set方法在视频指针上不起作用。在这种情况下,我们将不可避免地回到方法2。

那么,有没有办法将这两个方法封装到一个函数中呢?

我已经在imutils库中实现了count_frames函数,但为了确保你理解其中的内容,我们今天将回顾整个函数。

计算帧数的简单方法

在OpenCV中计算视频帧数的第一种方法非常快——它只是使用OpenCV提供的内置属性来访问视频文件并读取视频的元信息。

现在让我们来看看这个函数是如何在imutils中实现的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# import the necessary packages
from ..convenience import is_cv3
import cv2
def count_frames(path, override=False):
  # grab a pointer to the video file and initialize the total
  # number of frames read
  video = cv2.VideoCapture(path)
  total = 0
  # if the override flag is passed in, revert to the manual
  # method of counting frames
  if override:
    total = count_frames_manual(video)

首先,我们在第2行和第3行上导入必要的Python包。我们需要is_cv3函数来检查实际的OpenCV使用的是cv2还是OpenCV的哪个版本。

我们在第5行定义count_frames函数。这个方法需要一个参数以及一个可选参数:

path:这是我们的视频文件在磁盘上的路径。 override:一个布尔标志,用来决定我们是否应该跳过方法1而直接使用速度较慢(但保证准确无错误)的方法2。

我们访问cv2.VideoCapture,在第7行上的VideoCapture获得一个指向实际视频文件的指针,然后初始化视频中的帧总数。

然后我们在第11行进行检查,看看是否应该重写。如果是,我们调用count_frames_manual函数(我们将在下一节中定义)。

如果否,就让我们看看方法1是如何实际实现的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  # otherwise, let's try the fast way first
  else:
    # lets try to determine the number of frames in a video
    # via video properties; this method can be very buggy
    # and might throw an error based on your OpenCV version
    # or may fail entirely based on your which video codecs
    # you have installed
    try:
      # check if we are using OpenCV 3
      if is_cv3():
        total = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
      # otherwise, we are using OpenCV 2.4
      else:
        total = int(video.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT))
    # uh-oh, we got an error -- revert to counting manually
    except:
      total = count_frames_manual(video)
  # release the video file pointer
  video.release()
  # return the total number of frames in the video
  return total

为了通过OpenCV提供的API来确定视频文件中的帧数,我们需要利用所谓的捕获属性,其被OpenCV称为CAP_PROP(任何时候你看到一个以CAP_PROP_*开头的常量,你应该知道它与视频处理相关)。

在opencv3中,帧计数属性的名称是cv2.CAP_PROP_FRAME_COUNT,理想情况下,将各自的属性名称传递给视频指针的.get方法将允许我们获得视频中的总帧数(第10-15行)。

但是,根据你的OpenCV安装版本和视频编解码器的不同,这种方法在某些情况下会失效。

如果是这种情况,我们已经用一个try/except块包装了关键代码段。如果出现异常,我们只需还原为手工计算帧数(第16和17行)。

最后,我们释放视频文件指针(19行)并返回视频的总帧数(21行)。

循环计数

上文介绍了快速、高效的方法来计算视频帧数,现在让我们转到较慢的count_frames_manual方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def count_frames_manual(video):
  # initialize the total number of frames read
  total = 0
  # loop over the frames of the video
  while True:
    # grab the current frame
    (grabbed, frame) = video.read()
   
    # check to see if we have reached the end of the
    # video
    if not grabbed:
      break
    # increment the total number of frames read
    total += 1
  # return the total number of frames in the video file
  return total

count_frames_manual函数只需要一个单独的参数video,我们假设它是一个由cv2.VideoCapture实例化的指针。

首先我们初始化从视频的帧数变量total=0,循环帧,直到我们到达视频的末尾,并在此过程中增加计数器total。

然后将total返回给调用函数。

值得一提的是,该方法是完全准确无误的。

在使用这个函数时,也可能会返回零帧。当这种情况发生时,99%的可能性是:

  • 你给cv2.VideoCapture提供了无效的视频文件路径。
  • 您没有安装适当的视频编解码器,因此OpenCV无法读取该文件。如果是这种情况,则需要安装适当的视频编解码器,然后重新编译并重新安装OpenCV。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Opencv视觉实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
OpenCV - 计算相机和视频的帧速率FPS
OpenCV 库中的 VideoCapture 类主要处理视频读取以及从连接的相机中获取图像帧.
AIHGF
2019/06/14
20.7K0
【从零学习OpenCV】 视频数据的读取&摄像头的直接调用
虽然视频文件是由多张图片组成的,但是imread()函数并不能直接读取视频文件,需要由专门的视频读取函数进行视频读取,并将每一帧图像保存到Mat类矩阵中,代码清单2-27中给出了VideoCapture类在读取视频文件时的构造方式。
小白学视觉
2019/11/09
2.3K0
【从零学习OpenCV】 视频数据的读取&摄像头的直接调用
OpenCV-Python学习教程.1
因为最近做图形算法比较多,所以对cv2熟悉是必然的,倒是和以前的函数差不多,就是一些小细节不太一样。
云深无际
2021/04/14
5920
OpenCV-Python学习教程.1
opencv视频输入每帧处理之后组合视频导出(python)
最近项目有个需求,需要将一段视频输入进去之后进行标注,然后以视频形式导出,这里特此记录。
zstar
2022/06/14
5550
OpenCV3计算机视觉——处理文件、摄像头
randomByteArray=bytearray(os.urandom(120))
用户7180691
2020/04/09
6870
C++ OpenCV摄像头及视频操作类​VideoCapture介绍
前面的文章我们做了对图片的一些处理,OpenCV里面还有对动态视频的处理,通过动态视频图像每一帧生成的Mat再对图像可以进行处理。接下来我们学习一下OpenCV打开摄像头和播放视频的基本操作。
Vaccae
2019/07/24
4.8K0
使用OpenCV和Python生成电影条形码
本文来自光头哥哥的博客【Generating movie barcodes with OpenCV and Python】,仅做学习分享。
周旋
2020/10/23
1.6K0
使用OpenCV和Python生成电影条形码
opencv学习—VideoCapture 类基础知识「建议收藏」
以下是对两位大神的博客进行简单整理得到:http://blog.csdn.net/weicao1990/article/details/53379881
全栈程序员站长
2022/08/03
4.6K0
opencv学习—VideoCapture 类基础知识「建议收藏」
cv2.VideoWriter_fourcc()
#环境:opencv 3.4.0 python 3.5.2#读取视频import cv2cap = cv2.VideoCapture('video.avi')#读取摄像头,0为摄像头索引,当有多个摄像头时,从0开始编号cap = cv2.VideoCapture(0)#从视频或摄像头中读取一帧(即一张图像),返回是否成功标识ret(True代表成功,False代表失败),img为读取的视频帧ret,frame = cap.read()----#完整的读取视频流并播放视频流代码 # -*- coding
狼啸风云
2019/09/19
15.5K0
视频逐帧读取并保存至指定文件夹(opencv之python描述)
frame = video.read()
用户4908836
2020/04/14
1.8K0
【python-opencv】读取、显示、保存视频
要捕获视频,你需要创建一个 VideoCapture 对象。它的参数可以是设备索引或视频文件的名称。设备索引就是指定哪个摄像头的数字。正常情况下,一个摄像头会被连接(就像我的情况一样)。所以我简单地传0(或-1)。你可以通过传递1来选择第二个相机,以此类推。在此之后,你可以逐帧捕获。但是在最后,不要忘记释放俘虏。
西西嘛呦
2020/08/26
8K0
使用Python-去除视频背景
no怕不了木
2023/08/08
7210
使用Python-去除视频背景
百万点赞怎么来?Python批量制作抖音的卡点视频原来这么简单!
玩抖音的朋友都应该知道,最近「卡点视频」简直不要太火。抖音上很多大神也出了剪辑各种卡点视频的教程。
一墨编程学习
2019/07/18
2.8K0
百万点赞怎么来?Python批量制作抖音的卡点视频原来这么简单!
OpenCV Android 之 VideoCapture类
首先,需要明确一个根本问题。OpenCV 是一个基于 Apache2.0 许可(开源)发行的跨平台计算机视觉和机器学习软件库。它实际上各种图像处理和计算机视觉方面的通用算法的集中库。
zinyan.com
2023/07/14
1.5K0
OpenCV Android 之  VideoCapture类
手把手教你使用opencv-python库制作屏幕录制工具(附源码)
最近有在使用屏幕录制软件录制桌面,在用的过程中突发奇想,使用python能不能做屏幕录制工具,也锻炼下自己的动手能力。接下准备写使用python如何做屏幕录制工具的系列文章:
陈晨135
2022/01/08
3.4K0
精通 Python OpenCV4:第一部分
在本书的第一部分中,将向您介绍 OpenCV 库。 您将学习如何安装开始使用 Python 和 OpenCV 进行编程所需的一切。 另外,您还将熟悉通用的术语和概念,以根据您所学的内容进行语境化,并为掌握本书的主要概念奠定基础。 此外,您将开始编写第一个脚本以掌握 OpenCV 库,并且还将学习如何处理文件和图像,这是构建计算机视觉应用所必需的。 最后,您将看到如何使用 OpenCV 库绘制基本和高级形状。
ApacheCN_飞龙
2023/04/27
3.2K0
Python实现高级电影特效
前几天写了个实现特效的博客,感觉有点差强人意,只是简简单单的换背景应用场景不是非常多,今天就来实现一个更加复杂的特效“影分身”。下面有请我们本场的主演,坤制作人为我们表演他拿手的鸡你太美。
ZackSock
2020/05/18
1.4K0
Python实现高级电影特效
[1214]基于Python实现视频去重
一款基于Python语言的视频去重复程序,它可以根据视频的特征参数,将重复的视频剔除,以减少视频的存储空间。它的基本原理是:首先利用Python语言对视频文件进行解析,提取视频的特征参数,如帧率、码率等;然后根据特征参数,生成视频的哈希值;最后,将每个视频的哈希值进行对比,如果哈希值相同,则表示视频内容相同,可以将其中一个视频剔除,以节省存储空间。
周小董
2023/10/10
5860
Timestamps are unset in a packet for stream 0. This is deprecated and will stop
发布于2022年4月10日 最近,在处理多媒体应用程序或视频处理库时,您可能会遇到一个警告信息,提示“流0的数据包中未设置时间戳,这已不推荐使用,并将在未来停止工作”。在本篇博客文章中,我们将讨论这个警告的含义,为什么它被弃用,并介绍解决方法。
大盘鸡拌面
2023/11/15
1.3K0
Python实现5毛钱特效
Python牛已经不是一天两天的事了,但是我开始也没想到,Python能这么牛。前段时间接触了一个批量抠图的模型库,而后在一些视频中找到灵感,觉得应该可以通过抠图的方式,给视频换一个不同的场景,于是就有了今天的文章。
ZackSock
2020/04/16
1K0
推荐阅读
相关推荐
OpenCV - 计算相机和视频的帧速率FPS
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验