原目的是侦测文字游戏录屏的画面的变化以推送至负责OCR和翻译的第二个程序处理为字幕文件(就是自动生成文字游戏录屏字幕的项目的一个环节),不过,或许也可以有一些别的用途?注释非常非常之详细,可以看了注释做改动

By 某不知名的B站文字游戏博主 @符若_float

**注意 默认的threshold值(0.98)非常高,如非监控文字变动等微小变化请适度调低

import cv2 #使用了这个库进行fps读取和图片的读取
import os #使用这个库进行输入和输出
import time #使用这个库对程序的运行进行计时
from skimage.metrics import structural_similarity as ssim #使用这个库进行对于生成图片的细筛'''
Author: AleryXiao
Date: 2022.10.15
Title: 抽取视频关键帧(可设置抽样频率和相似程度要求) v1.0
Content: 0. *两个用户可设定参数*(分别位于Line27和Line28)a. 抽帧频率targetFPS (每秒钟抽取几帧)b. 目标相似度threshold (低于此相似度的图片将会被保存)更高的targetFPS会消耗更多的时间, 但是会生成更精确的时间码**注意 默认的threshold值非常高,如非监控文字变动等微小变化请适度调低1. 通过弹出的文件资源窗口选择一个或多个视频文件2. 对于每个视频文件:按给定的每秒帧数进行抽帧(cv2.VideoCapture) 抽取的帧存储在temp.jpg中对于第0个满足条件的帧, 存储至cache中对于其它满足条件的帧, 将之与cache作比较: 如果相似度大于threshold  ->储存至本地和cache, 更新cache为这一图片, 输出储存信息如果相速度小于threshold  ->输出舍弃信息(SSIM的运行速度较为有限, 或许可以考虑使用多线程运行?)完成后, 关闭抽帧相机, 输出完成的信息
'''targetFPS = 3  # 目标每秒选取的帧数(越低越快,相对的,时间轴精度就比较低)
threshold = 0.98  # 目标相似度(低于此相似度的图片才会被保存)def frames2time(frames, fps):  # 给定fps,将帧数转化为指定格式的视频时间(匹配popsub,小时数是假的2333,不能超过1小时,想要什么格式可以自己改ww)fpm = fps*60a = int(frames/fpm)  # 分钟数(取整)frames %= fpm  # 余下帧数b = frames/fpsreturn "0_"+f"{str(a):0>2}"+"_"+f"{b:0>5.2f}"def video_to_frames(video_path, outPutDirName, frame_frequency):if not os.path.exists(outPutDirName):  # 如果文件目录不存在则创建目录os.makedirs(outPutDirName)camera = cv2.VideoCapture(video_path)  # 创建一个相机,读取视频帧frames = -1T = int(frame_frequency/targetFPS)  # 周期每秒3帧while True:frames = frames + 1  # 第frames帧(0base)res, image = camera.read()if not res:print('Completed!')breakif frames % T == 0: #按照周期抽帧,不到周期就跳过cv2.imwrite(outPutDirName + '/temp.jpg', image)img1 = cv2.imread(outPutDirName + '/temp.jpg')  # 每周期保存一个临时文件if frames==0:cv2.imwrite(outPutDirName + '/' +frames2time(frames, frame_frequency)+'.jpg', image)cache = img1 #每次遇到“新图片”就存储,并刷新缓存print('OvO '+str(frames)+' OwO')else:if ssim(img1, cache, multichannel=True) > threshold:print('___ '+str(frames)+' ___')else:cv2.imwrite(outPutDirName + '/' +frames2time(frames, frame_frequency)+'.jpg', image)cache = img1 #每次遇到“新图片”就存储,并刷新缓存print('OvO '+str(frames)+' OwO')os.remove(outPutDirName + '/temp.jpg')  # 删除临时文件camera.release()  # 释放相机if __name__ == "__main__":start=time.time()from tkinter import filedialog as fd  # 窗口式输入import tkinter as tkroot = tk.Tk()root.withdraw()input_list = fd.askopenfilenames(filetypes=[('视频文件', ['.flv', '.mp4', '.mov'])])  # 可以批量选取!结果输出在相同目录的同名文件夹for video_name in input_list:videoCapture = cv2.VideoCapture(video_name)print("正在处理视频: "+video_name)fps = videoCapture.get(cv2.CAP_PROP_FPS)        # 获取帧速率(frames per second)video_to_frames(video_name, video_name[:-4], fps)  # 输出在同一目录下的同名文件夹print("视频"+video_name+"已处理完成~\n****************")end=time.time()print(f"用时共计{end-start}秒")

ヽ(✿゚▽゚)ノ

《母语是C草但是因为python的优良库生态努力地学习了异国他乡的语言》的感觉……作为python萌新的我能写到这里应该给自己鼓个掌!(掌声!)

这段代码感觉比较难受的一个地方就是那个temp文件,明明都是cv2的读取格式但是不知道怎么传参image到img2……这一部分可能是有一些性能损失的,不过最卡时间的地方应该还是那个相似度判断,就看想要怎么用啦。

我个人测试了一些视频,感觉这个方法算下来耗时和效果还是比较能够兼顾的,如果后面我有学到新的方法再对它进行改进吧~

Python 自定义抽取视频关键帧 (可设置抽样频率和相似程度要求) CV2Skimage V1.0相关推荐

  1. 怎么设置路由器无线网络连接服务器,TP-Link TL-WDR5600 V1.0无线桥接怎么设置(2.4G无线网络)...

    本文主要介绍了TP-Link TL-WDR5600 V1.0路由器无线桥接设置方法,注意是V1.0版本的TL-WDR5600路由器无线桥接设置.目前TL-WDR5600无线路由器有V1.0和V2.0两 ...

  2. python编程 迷你世界_迷你编程电脑版|迷你世界迷你编程下载 v1.0官方版 - 绿点软件站...

    迷你世界迷你编程是一款简单易学图形化编程软件,软件采用图形化的编程方式,过程就像组合积木一样简单,不但可以帮助青少年学习基础的编程知识,也提高了数学逻辑思维能力,还可以让孩子们感受到创造三维立体世界的 ...

  3. 使用python爬取视频

    写在前面:此博客仅用于参考学习,代码中部分网址已删 准备工作 python burpsuite 视频爬取 视频网址:https://v.qq.com/x/cover/mzc00200xnrv1u5.h ...

  4. Python+Opencv2(三)保存视频关键帧

    文章目录 一.前言 二.视频中保存每帧图片 三.帧间差法 1.两间查分法 (1)处理一段视频 (2)批量处理视频 (3)扩展 2.三间差分法 一.前言 依然是博主毕设的手语检测,好多图片要处理哦! 今 ...

  5. python实现视频关键帧提取(基于帧间差分)

    python实现视频关键帧提取(基于帧间差分) 在很多场景下,我们不想或者不能处理视频的每一帧图片,这时我们希望能够从视频中提取出一些重要的帧进行处理,这个过程我们称为视频关键帧提取. 关键帧提取算法 ...

  6. python视频提取关键帧_一种视频关键帧提取算法的制作方法

    本发明属于信息安全技术领域,涉及视频内容信息的提取,具体来说,是一种视频关键帧提取算法. 背景技术: 随着Internet的应用和普及,多媒体信息检索系统对社会各领域产生越来越大的影响.传统的信息检索 ...

  7. Python:使用PyAV提取视频关键帧

    Python:使用PyAV提取视频关键帧 1.软件环境⚙️ 2.问题描述

  8. 视频关键帧提取 java_JavaCV实现将视频以帧方式抽取

    使用前: 在用JavaCV实现以帧方式抽取视频的前,我们需要先从bytedeco/javacv下载第三方的压缩包,解压后按自己的需求往自己的IDE ( * IDEA / Eclipse * ) 导入解 ...

  9. python视频帧提取并保存_如何用python实现视频关键帧提取并保存为图片?

    展开全部 import cv2 vc = cv2.VideoCapture('Test.avi') #读入视频文件2113 c=1 if vc.isOpened(): #判断是否正常打开5261 rv ...

最新文章

  1. C#命名规范 C#控件的缩写大全
  2. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )
  3. 2021牛客暑期多校训练营3 I Kuriyama Mirai and Exclusive Or 差分 + 二进制分治
  4. 李宏毅机器学习(二)自注意力机制
  5. Qt工作笔记-各种构造函数汇总以及运算符重载(入门必备)
  6. QT| C/C++之win98扫雷外挂增强版
  7. 云计算教程学习入门视频课件:常用数据库排名
  8. linux鼠标改为自动聚焦,如何在Linux上取消聚焦(模糊)Pythongi GTK+3窗口
  9. 关于序列化的 10 几个问题,你肯定不知道
  10. mysql 时间查询_MYSQL按时间段查询语句大全
  11. python中callable什么意思_Python中的callable()
  12. 【Excel 教程系列第 16 篇】打印 Excel 表格时,如何设置每页都有表头
  13. 2018浙大408考研经验(划掉)个人口胡 普通一本+二战(伪)+小跨吧大概
  14. [Java]Spring Ioc讲解,不怕你不懂
  15. [转载] UEFI+GPT双硬盘安装Win10+Ubuntu16.04双系统
  16. Android 文字测量
  17. 电子商务的整合之道--思践
  18. 【C++】STL——string(两万字详解)
  19. 云IDE:Coding的Cloud Studio
  20. python 协程池和pool.map用法

热门文章

  1. 男扮女装参加超级女声的经历<转>
  2. 用户故事在软件管理中的应用
  3. 金山张宴 - PHP在金山游戏运营中的应用
  4. LeetCode:605. Can Place Flowers种花问题(C语言)
  5. 使用Dell EMC SupportAssist Enterprise 来检查DELL服务器硬件故障
  6. 【手机】欧陆词典安装词典包
  7. Mac OS X 分区失败
  8. C语言入门必刷题-牛客网精选-经典题型-一定来试试哦
  9. android系统 中使应用默认获取通知使用权
  10. 博达路由器配置外网IP和默认路由