我的 python 代码不将视频帧保存为图像

2024-01-03

我正在尝试抓取视频中的特定帧(例如帧 0、10、20...),并使用 Python 和 CV2 将它们保存为图像。由于某些原因,我的代码只保存第一帧。所有其他帧均已创建,但大小为 0(它们已损坏)。

我该如何解决这个问题?

import cv2
from numpy import integer

number = 10;
filename = "18s.mp4";

def uniform():
    cap = cv2.VideoCapture(filename);
    frame_count= int(cap.get(cv2.CAP_PROP_FRAME_COUNT));
    print(frame_count)

    for x in range(0, number):
            frame_no = 1*(x/number)
            frame_no_int=int(frame_no*frame_count)

            cap.set(2,frame_no);
            ret, frame = cap.read()
            cv2.imwrite(filename+'_frame_'+str(frame_no_int)+'.jpg', frame);

    # When everything done, release the capture
    cap.release()

if __name__ == '__main__':
    uniform()

显然,CAP_PROP_POS_AVI_RATIO(常量 2,您在中使用的cap.set())效果不好。看一下修改后的脚本的输出:

import cv2
from numpy import integer

number = 10
filename = 'chaplin.mp4'

def uniform():
    cap = cv2.VideoCapture(filename)
    frame_count= int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    print(frame_count)

    for x in range(0, number):
        frame_pos_ratio = 1.0*x/number
        frame_no_int=int(frame_pos_ratio*frame_count)
        cap.set(cv2.CAP_PROP_POS_FRAMES, frame_no_int)
        print (frame_no_int, cap.get(cv2.CAP_PROP_POS_AVI_RATIO))
        ret, frame = cap.read()
        cv2.imwrite('_frame_'+str(frame_no_int)+'.jpg', frame)

    # Attempt to go the end of film
    cap.set(cv2.CAP_PROP_POS_AVI_RATIO, 1)
    print (cap.get(cv2.CAP_PROP_POS_FRAMES))

    # When everything done, release the capture
    cap.release()

if __name__ == '__main__':
    uniform()

Output:

172
(0, 6.510416666666667e-05)
(17, 6.510416666666667e-05)
(34, 6.510416666666667e-05)
(51, 6.510416666666667e-05)
(68, 6.510416666666667e-05)
(86, 6.510416666666667e-05)
(103, 6.510416666666667e-05)
(120, 6.510416666666667e-05)
(137, 6.510416666666667e-05)
(154, 6.510416666666667e-05)
150.0

如你看到的,cap.get(cv2.CAP_PROP_POS_AVI_RATIO)循环内只返回一个常量6.51e-05.

即使有 174 帧,cap.set(cv2.CAP_PROP_POS_AVI_RATIO, 1)只带你到第 150 帧,这绝对是一个错误。

此行为符合这个问题 https://stackoverflow.com/questions/47162334/python-opencv-getcap-prop-pos-avi-ratio-returning-a-fixed-number-in-while-loop.

附:有趣的是,甚至cv2.CAP_PROP_FRAME_COUNT无法正常工作。显然,我的视频文件仅包含 150 帧,但它们的编号从 22 到 171,如下所示ffprobe -show_frames chaplin.mp4 | grep coded_picture_number。因此 CAP_PROP_FRAME_COUNT 的输出只是 max(frame_no)+1。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的 python 代码不将视频帧保存为图像 的相关文章

随机推荐

  • 如何将 OAuth2 与 Node.js 结合使用

    我想使用 google cloud 客户端库将数据插入 BigQuery 由于我有多个客户端 并且每个客户端都有不同的 IAM 角色 因此我无法使用如下服务帐户 const bigquery new BigQuery projectId m
  • ScrollView 不显示整个 TableLayout

    我想显示一个TableLayout在一个ScrollView 该表有 9 个TableRow但ScrollView开始显示第四行的部分内容 我无法向上滚动查看上面的行 XML 布局
  • Cappuccino、Django、AJAX,并将它们组合在一起 - 回顾我的架构!

    我正在尝试了解卡布奇诺 我希望我的 StackOverview 同行审查下面的架构 看看它是否有意义 目的是利用 Django 和 Cappuccino 的独特优势 而无需在技术重叠的地方加倍 当 Web 浏览器请求 友好 URL 例如 a
  • 记住多个项目的已读/未读状态的最有效方法是什么?

    例如 我们采用论坛的格式 其中有多个用户和多个线程 假设该论坛想要跟踪哪些用户已阅读哪些线程 并在查看线程列表时使用该信息来标记哪些线程未读 我能想到的唯一解决方案是每次用户访问线程时将记录放入数据库中 我想可能有一个 将所有标记为已读 按
  • 保存字符串时 SharedPreferences nullPointerException

    我正在为 Android 工作启动器 目前我正在处理地址簿 是的 我想将其包含到我的启动器中 但我正在NullPointerException 这是我的主框架的一部分 其中调用了导致错误的类 Numbers j new Numbers Ed
  • Razor 对通用扩展方法的支持

    关于 Razor 视图引擎 假设我想渲染Html TextBoxFor
  • 在 PHP 中将指数转换为整数[重复]

    这个问题在这里已经有答案了 可能的重复 在php中将指数数转换为小数 https stackoverflow com questions 4461444 convert exponential number to decimal in ph
  • 如何清理精灵而不覆盖其他东西?

    我正在尝试在 pygame 中制作俄罗斯方块 并且发生了碰撞和移动 但是当遮罩与放置的块碰撞时 我用来覆盖旧精灵的矩形覆盖了放置的精灵的部分 def replace self pygame draw rect board surface 0
  • 如何实现iOS应用内购买动态价格图书?

    我开发了一个 iOS 应用程序 用户可以购买有声读物 从而可以在应用程序内进行流式传输和下载 我已经集成了 Authorize net 支付网关 被苹果拒绝了 说 11 2 使用应用内购买 API IAP 以外的系统来购买应用中的内容 功能
  • Symfony 5 security.interactive_login 事件未调用

    我想使用security interactive login更新我的用户的上次登录字段的事件 活动注册成功 php bin console debug event dispatcher security interactive login
  • 如何用Java计算Azure存储容器大小?

    虽然以下链接详细介绍了使用 C 计算存储大小的方法 但我在 Java 中没有看到类似的方法 如果有人可以发布 Java 示例代码 我将不胜感激 Azure 存储容器大小 https stackoverflow com questions 1
  • 如何获取 SQLite 数据库表中的列列表?

    我正在寻找检索表中的列列表 该数据库是最新版本的 SQLite 我相信是 3 6 我正在寻找使用 SQL 查询执行此操作的代码 与列相关的元数据的额外奖励点 例如长度 数据类型等 您要查找的内容称为数据字典 在 sqlite 中 可以通过查
  • xrange 与 itertools.count Python 2.7

    我想运行从开始值到结束值的范围 它在较小的数字上工作正常 但当它变得太大时 会导致溢出错误 因为 int 太大而无法转换为 C Long 我正在使用Python 2 7 3 我在这里读到OverflowError Python int 太大
  • 如何在Spring Data JPA中执行AND和多个OR参数方法

    我正在尝试为此查询制定方法名称 Query from Employees where department 1 and fullTime true or contractor true or subContractor true 我认为这种
  • 抑制 C 警告“未使用的变量 x”的最佳方法? [复制]

    这个问题在这里已经有答案了 抑制 C 编译器 例如 GCC 如 未使用的变量 x 警告的最佳 最巧妙的方法是什么 GCC 文档解释 Wunused 变量每当局部变量或非常量静态变量除了其声明之外未使用时发出警告 我不想给我的编译器任何特定的
  • py2exe:由于 DLL,编译的 Python Windows 应用程序将无法运行

    我承认我对 Python 还很陌生 而且我还不知道自己在做什么 最近 我使用 Python 2 6 2 和 wxPython 2 8 创建了一个非常小的 Windows 应用程序 而且效果很好 我对它正常运行的情况感到非常满意 通常我的意思
  • C - IF(char[] == "ZYX") 不起作用

    我从arduino发送到arduino字符串 I2C 捕获并保存到char 10 当我将此变量与文本进行比较时 条件没有执行 而且我不知道为什么 char dataRx 10 void DaemonReceiving int howMany
  • 当外字段是数组时 MongoDB 查找

    我搜索过互联网和 StackOverflow 但找不到答案 甚至找不到问题 我有两个收藏 reports and users 我希望我的查询返回所有报告 并指示指定用户是否将该报告作为其数组中的最爱 报告收集 id 1 name Repor
  • Android 虚拟设备管理器因“双重释放或损坏”而崩溃

    当我尝试运行任何模拟器时 我得到 Android 虚拟设备崩溃 https i stack imgur com bmI8A png 我玩 Android studio 的控制台说 Error in home standy Android S
  • 我的 python 代码不将视频帧保存为图像

    我正在尝试抓取视频中的特定帧 例如帧 0 10 20 并使用 Python 和 CV2 将它们保存为图像 由于某些原因 我的代码只保存第一帧 所有其他帧均已创建 但大小为 0 它们已损坏 我该如何解决这个问题 import cv2 from