opencv自定义间隔帧获取视频转存为图片

该代码只将mp4转为jpg

扩展

如果您只是想使用这段代码自定义间隔帧获取视频转存为图片的功能,在opencv自定义间隔帧获取视频转存为图片的GUI界面实现可以更方便您的使用。

背景

由于我要做一个深度学习方向的计算机视觉项目,需要一些数据集来进行训练,我便想尝试捕获视频中的图片用来标注。

注意事项

如果视频中的场景单一,那么使用该视频获取的数据集训练出的模型面对其他场景的泛化能力就会受到限制。为了提高数据集的多样性,可以采用多种不同场景的视频,并且在获取数据时采用大间隔捕获的方式。采用大间隔捕获数据的方法可以捕获到的图片同质化降低,从而进一步增加数据集的多样性。

复制代码
import os
import sys
from concurrent.futures import ThreadPoolExecutor
import cv2

def output_img(video_path,img_dir):
#     由视频逐帧输出图片
#     video_path: 视频文件路径
#     img_dir: 图片保存目录路径,路径不支持中文
    os.makedirs(img_dir,exist_ok=True)
#     img_dir:表示要创建的目录路径。
#     exist_ok=True:表示如果目录已经存在时不抛出异常。如果将 exist_ok 设置为 True,那么如果目录已经存在,os.makedirs() 函数也不会报错;如果设置为 False,则会抛出一个 FileExistsError 异常。
    cv = cv2.VideoCapture(video_path)
    frame_count = 0 
    # 计数器
    n = 0
    # 命名计数器
    while True:
        ret,frame = cv.read()
        if not ret:
            break
        frame_count += 1
        if frame_count % 30 ==0:
            # 每隔三十帧获取一次图片
            n += 1
            img_name = "0000000{0}.jpg".format(n)
            img_file_path = os.path.join(img_dir,img_name)
            if not os.path.exists(img_file_path):
                sys.stdout.write("创建文件:"+ img_file_path + "\n")
                # 标准输出流,将指定文本输出到控制台或其他输出设备中
                cv2.imwrite(img_file_path,frame,[cv2.IMWRITE_JPEG_QUALITY,100])
                # 将图像帧保存为jepg格式的图像,质量最高为100
            else:
                sys.stderr.write("跳过:" + img_file_path + "\n")
                ret,frame = cv.read()

def run(video_dir,img_dir):
    pool = ThreadPoolExecutor()
    # 创建一个线程池对象,实例化ThreadPoolExecutor类,将任务提交给线程池,线程池会自动调度线程来执行这些任务
    for file in os.listdir(video_dir):
        if file[-4:] == ".mp4":
            video_file_path = os.path.join(video_dir,file)
            img_dir_name = os.path.join(img_dir,file[:-4])
            os.makedirs(img_dir_name,exist_ok=True)
            pool.submit(output_img,*(video_file_path,img_dir_name))
#* 和 ** 是用于解包参数的操作符。在这种情况下,*(video_file_path, img_dir_name)
# 的作用是将元组 (video_file_path, img_dir_name) 中的元素解包并作为单独的参数传递给函数。

if __name__ == '__main__':
    run(r"E:\video",r"E:\image")
相关推荐
空 白II10 小时前
10.11 大语言模型研究简报:Anthropic 披露 Claude Agent 四类越权失序行为
人工智能·语言模型·自然语言处理
具身AGI10 小时前
世界模型改当裁判,物理AI 物理推理 做判据
人工智能·深度学习·机器学习
yi01110 小时前
LeetCode 3. 无重复字符的最长子串|不定长滑动窗口:什么时候更新最大值?
笔记·python·算法·leetcode·双指针·滑动窗口
狂奔蜗牛(bradley)10 小时前
EtherCAT 主站拓扑判定的三级防护:从去抖到振荡检测
人工智能·嵌入式硬件·fpga开发·架构
XMAIPC_Robot10 小时前
工商业储能EMS边缘计算:本地AI负荷预测,彻底摆脱云端依赖
人工智能·fpga开发·机器人·边缘计算·arm+fpga·rk3588+fpga
奈落2410 小时前
AI 办公助手选型指南:从聊天问答到主动式工作流,企业办公自动化该怎么挑、边界在哪
人工智能·自动化·工作流·ai 办公
正经人_x10 小时前
学习日记59:PAVL
人工智能·学习·计算机视觉
MacroZheng10 小时前
这可能是Windows下最适合Claude Code/Codex的终端了,真的夯!
人工智能·后端·ai编程
还是奇怪10 小时前
GPT-6 Sol 与 Luna 发布后,选型还要确认什么?从官方参数到迁移验证
人工智能·gpt·openai
2601_9628857210 小时前
如何用 Python 计算索提诺比率和卡玛比率?
开发语言·python