视频抽帧工具:按需提取高质量数据集

news/2025/2/13 5:37:05/

引言

在视频数据处理中,抽帧是一项非常重要的任务。针对某些场景,我们需要在特定时间段提高抽帧频率(以捕获更多目标画面),而在其他时间段保持较低抽帧频率(以减少数据冗余并获取背景画面)。本文将分享一段代码,能够对指定视频按需抽帧,既保证了目标画面的多样性,又获取了一定量的背景数据。

功能介绍

这段代码主要实现了以下功能:

  1. 支持自定义时间段的抽帧频率: 可以针对视频的不同时间段,设置不同的抽帧间隔。
  2. 默认抽帧频率设置: 未指定时间段的帧,按照默认频率抽取。
  3. 抽帧进度实时可见: 使用 tqdm 实现进度条显示,便于监控处理进度。
  4. 抽取结果自动保存: 抽取的帧会以 .jpg 格式保存到指定文件夹中,文件名包含视频名称及帧编号。

使用场景

  • 目标检测数据集制作: 在视频中捕获目标密集区更多帧,以提升目标检测模型的训练效果。
  • 背景数据采集: 在目标稀疏或无目标的时段,按较低频率采集背景帧,减少数据冗余。
  • 视频分析与处理: 提取关键帧用于后续视频内容分析。

代码实现

import os
import cv2
import math
from tqdm import tqdmdef extract_frames_from_single_video(video_path, output_folder, time_interval_frame_interval_dict, default_frame_interval):cap = cv2.VideoCapture(video_path)  # 打开视频文件if not cap.isOpened():  # 检查视频是否成功打开print(f"无法打开视频文件 {video_path}")returnfps = math.ceil(cap.get(cv2.CAP_PROP_FPS))  # 获取并向上取整视频的fps# 设置计数器和帧数frame_count = 0frame_num = 0# 初始化当前抽帧间隔为默认间隔current_frame_interval = default_frame_intervaltotal_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))  # 计算视频总帧数video_name = os.path.splitext(os.path.basename(video_path))[0]with tqdm(total=total_frames, desc=f"Processing {video_name}") as pbar:while True:  # 对于每一帧ret, frame = cap.read()  # 读取视频帧if not ret:  # 判断是否到达视频末尾breakcurrent_time = frame_count // fps  # 计算当前帧在第几秒for interval, frame_interval in time_interval_frame_interval_dict.items():if interval[0] <= current_time < interval[1]:  # 如果当前时间在特定的范围内current_frame_interval = frame_interval  # 更改抽帧间隔breakelse:  # 如果没有在任何特定的范围内,使用默认的抽帧间隔current_frame_interval = default_frame_intervalframe_count += 1# 根据抽帧间隔选择帧进行保存if frame_count % current_frame_interval == 0:  frame_num += 1frame_name = f"{video_name}_{frame_num}.jpg"frame_path = os.path.join(output_folder, frame_name)cv2.imwrite(frame_path, frame)pbar.update()  # 更新进度条cap.release()  # 释放视频对象if __name__ == "__main__":# 视频文件夹的路径,输出文件夹的路径,视频文件名video_path = '/data/dataset/xxx.mp4'output_folder = '/data/dataset/img'# 特定时间段与抽帧频率的对应关系time_interval_frame_interval_dict = {(90, 115): 20,(116, 132): 10}  # 90-115秒,每20帧抽一张;116-132秒,每10帧抽一张# 默认的抽帧频率default_frame_interval = 30  # 其余时间每30帧抽一张extract_frames_from_single_video(video_path, output_folder, time_interval_frame_interval_dict, default_frame_interval)

参数说明

  • video_path: 视频文件路径。
  • output_folder: 抽帧结果保存路径。
  • time_interval_frame_interval_dict: 特定时间段与抽帧频率的映射关系。例如,{(90, 115): 20} 表示 90 到 115 秒内,每 20 帧保存一张图片。
  • default_frame_interval: 默认抽帧间隔,用于未指定时间段。

以上代码简单高效,适用于需要处理大量视频并生成数据集的场景。如果你觉得有帮助,欢迎点赞、评论或分享!


http://www.ppmy.cn/news/1562928.html

相关文章

如何搭建 Vue.js 开源项目的 CI/CD 流水线

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

用python实战excel和word自动化

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 python实现excel和word自动化--批量处理 前言--需求快要期末了需要&#xff0c;提交一个年级的学生成绩数据&#xff0c;也就是几百份。当前我们收集了一份excel表格&#xf…

【matlab学习】使用matlab求解微积分,进行数值积分和符号积分的计算

本部分的学习参考欧攀老师的《高等光学仿真(MATLAB版)》,为自学笔记 基本概念 符号积分,又称解析积分,是微积分中的一个基本运算。它通过数学推导和变换,求出被积函数的原函数或反导数,从而得到积分的精确值。符号积分的表示方法主要依赖于积分符号“∫”以及被积函数和…

大模型系列——推理能力增强 rStar-Math 论文笔记

我们提出rStart-Math来证明小型语言模型SLM可以与OpenAI O1的数学推理能力相媲美甚至超越&#xff0c;而无需从更高级的模型中蒸馏。rStart-Math通过蒙特卡洛树搜索MCTS来实现深度思考&#xff0c;其中一个数学策略SLM执行测试时搜索&#xff0c;该搜索由基于SLM的过程奖励模型…

设计模式(3)——工厂模式

文章目录 三、day31. 简单工厂模式2. 工厂模式3. 抽象工厂模式 三、day3 今天学习最常见的设计模式之一——工厂模式。工厂模式提供了一种创建对象的最佳方式&#xff0c;在创建对象的时候&#xff0c;不会对客户端暴露创建逻辑&#xff0c;并且通过使用一个共同的接口来创建新…

【免费开源】积木JimuBI大屏集成ruoyiVue

JimuBI介绍 JimuBI 是一个JAVA语言的低代码数据可视化大屏BI产品&#xff0c;将大屏、仪表盘、移动面板、图表或页面元素封装为基础组件&#xff0c;无需编写代码即可完成业务需求。 这是JeecgBoot团队出品的另外一款报表产品&#xff0c;积木报表已经成为业内报表首先&#x…

品牌账号矩阵如何打造?来抄作业

在讲究全域营销的当下&#xff0c;目前企业都在各自搭建品牌矩阵号&#xff0c;以提升自己在不同渠道上的影响力。虽然不同平台之间有诸多细节值得深究&#xff0c;但也不妨碍我们先了解如何搭建品牌矩阵。接下来&#xff0c;就让我们一同来了解下该如何搭建。 一、一个主账号 …

初学stm32 --- DAC输出三角波和正弦波

输出三角波实验简要&#xff1a; 1&#xff0c;功能描述 通过DAC1通道1(PA4)输出三角波&#xff0c;然后通过DS100示波器查看波形 2&#xff0c;关闭通道1触发(即自动) TEN1位置0 3&#xff0c;关闭输出缓冲 BOFF1位置1 4&#xff0c;使用12位右对齐模式 将数字量写入DAC_…