import xlwt #导入模块
from skimage.metrics import structural_similarity as ssim  # 使用这个库进行对于生成图片的细筛
import time  # 使用这个库对程序的运行进行计时
import os  # 使用这个库进行输入和输出
import cv2  # 使用了这个库进行fps读取和图片的读取
import easyocr #离线OCR,需要配置,可自行百度EasyOcr配置方法
'''
Author: 符若_float
Date: 2022.10.18
Title: Galgame: Video Words to Excel
Ver: 1.1 ET/BT (EasyOcr & TerminalInput)/(BaiduOcr & TerminalInput)
**默认运行模式为EasyOcr,要使用百度Ocr,请填写API端口并用注释段替换原函数
Theme: 抽取视频关键帧(可设置抽样频率和相似程度要求)并批量OCR识别图片并输出时间轴和内容到Excel文档
Content:0. *两个用户可设定参数*a. 抽帧频率targetFPS (每秒钟抽取几帧)b. 目标相似度threshold (低于此相似度的图片将会被保存)更高的targetFPS会消耗更多的时间, 但是会生成更精确的时间码1. 选择一个视频文件2. 按给定的每秒帧数进行抽帧(cv2.VideoCapture) 抽取的帧存储在temp.jpg中对于第0个满足条件的帧, 存储至cache中对于其它满足条件的帧, 将之与cache作比较:如果相似度大于threshold  ->储存至本地和cache, 更新cache为这一图片, 输出储存信息OCR并将OCR结果和名字分别写入excel, 保存超链接如果相似度小于threshold  ->输出舍弃信息完成后, 关闭抽帧相机, 输出完成的信息
'''
targetFPS = 1  # 目标每秒选取的帧数(越低越快,相对的,时间轴精度就比较低)
threshold = 0.98  # 目标相似度(低于此相似度的图片才会被保存)def img2str(img_path):reader = easyocr.Reader(['ja'], gpu=True)     # 没有gpu的话需要加上gpu=Falsetry:result = reader.readtext(img_path)text = ''for sentences in result:text += sentences[1]return textexcept Exception as e:return ("ocr wrong occur here")#如果要使用百度OCR版本,请用此段替换上一段函数
'''
def get_file_content(file):with open(file, 'rb') as fp:return fp.read()def img2str(img_path):APP_ID = "qwq"  # 填自己的信息API_KEY = "qwqq"SECRET_KEY = "qwqqq"client = AipOcr(APP_ID, API_KEY, SECRET_KEY)image = get_file_content(img_path)# 调用通用文字识别, 图片参数为本地图片client.basicGeneral(image)# 如果有可选参数options = {}options["language_type"] = "JAP"  # 不说明是日语的话会爆炸!(xoptions["detect_direction"] = "false"options["detect_language"] = "false"options["probability"] = "false"# 带参数调用通用文字识别, 图片参数为本地图片try:res = client.basicGeneral(image, options)strx = ""for tex in res["words_result"]:  # 遍历结果strx += tex["words"]  # 每一行,不换行return strx  # 返回字符串except Exception as e:return ("ocr wrong occur here")
'''# 给定fps,将帧数转化为指定格式的视频时间(匹配popsub,小时数是假的2333,不能超过1小时,想要什么格式可以自己改ww)
def frames2time(frames, fps, sign):fpm = fps*60a = int(frames/fpm)  # 分钟数(取整)frames %= fpm  # 余下帧数b = frames/fpsreturn "0"+sign+f"{str(a):0>2}"+sign+f"{b:0>5.2f}"def checkPath(path):if not os.path.exists(path):  # 如果文件目录不存在则创建目录os.makedirs(path)def video2xlsx(video_path, output_path, frame_frequency):workbook = xlwt.Workbook() #创建workbook 对象worksheet = workbook.add_sheet('sheet1') #创建工作表sheetcheckPath(output_path)camera = cv2.VideoCapture(video_path)  # 创建一个相机,读取视频帧frames = -1i=0T = int(frame_frequency/targetFPS)  # 周期每秒targetFPS帧while True:frames = frames + 1  # 第frames帧(0base)res, image = camera.read()if not res:workbook.save(output_path+r'\Text.xls')  #保存表为Text.xlsprint('Completed!')breakif frames % T == 0:  # 按照周期抽帧,不到周期就跳过cv2.imwrite(output_path + '/temp.jpg', image)img1 = cv2.imread(output_path + '/temp.jpg')  # 每周期保存一个临时文件if frames == 0:output_img=output_path + '/' + frames2time(frames,frame_frequency, '_')+'.jpg'cv2.imwrite(output_img, image)cache = img1  # 每次遇到“新图片”就存储,进行识别,并刷新缓存text = img2str(output_img)  # OCRprint(text)worksheet.write(i, 0,xlwt.Formula('HYPERLINK("{}","{}")'.format(output_path,frames2time(frames, frame_frequency, ':')))) #0,0格为百度翻译try:worksheet.write(i, 1, xlwt.Formula('HYPERLINK("{}","{}")'.format(output_img,text)))  #往表中写内容,第一各参数表示行,第二个参数表示列,第三个参数为内容except Exception as e:worksheet.write(i, 1, "write wrong occur here")print("write wrong occur here")i+=1print('OvO  '+str(frames)+'  OvO')else:if ssim(img1, cache, multichannel=True) > threshold:print('___  '+str(frames)+'  ___')else:output_img=output_path + '/' + frames2time(frames,frame_frequency, '_')+'.jpg'cv2.imwrite(output_img, image)cache = img1  # 每次遇到“新图片”就存储,进行识别,并刷新缓存text = img2str(output_img)  # OCRprint(text)worksheet.write(i, 0, frames2time(frames, frame_frequency, ':'))try:worksheet.write(i, 1, xlwt.Formula('HYPERLINK("{}","{}")'.format(output_img,text)))  #往表中写内容,第一各参数表示行,第二个参数表示列,第三个参数为内容except Exception as e:worksheet.write(i, 1, "write wrong occur here")print("write wrong occur here")i+=1print('OvO  '+str(frames)+'  OvO')os.remove(output_path + '/temp.jpg')  # 删除临时文件camera.release()  # 释放相机from warnings import simplefilter
simplefilter(action='ignore', category=FutureWarning) #关闭futurewarningif __name__ == "__main__":print("你好! 欢迎使用Galgame:Video2Xlsx!\nAuthor:符若_float\nVersion:1.1 ET (EasyOcr & TerminalInput)")if input("请问需要修改参数吗?\n0: 直接开始!\n1:需要修改参数!\n>> ")=='1':targetFPS = float(input(f"请输入TargetFPS\n(该值意思为您的视频抽帧频率,推荐值为1,您之前的值为{targetFPS})\n这个值越大字幕时间轴的精度越高, 不过也会导致处理速度成倍降低、重复OCR次数少量增加哦\n>> "))  # 目标每秒选取的帧数(越低越快,相对的,时间轴精度就比较低)threshold = float(input(f"请输入threshold\n(该值意思为您的视频文字变动的判断阈值,推荐值为0.98,您之前的值为{threshold})如果效果尚可建议不要修改哦\n>> "))   # 目标相似度(低于此相似度的图片才会被保存)print("现在开始运行程序!\n注意:中途终止会导致xlsx保存失败哦")video_name= input("请输入文件地址~\n(您可以直接把文件拖入终端窗口或复制文件地址,输出文件将在您的视频文件的同一目录下的同名文件夹中)\n>> ")  # 可以批量选取!结果输出在相同目录的同名文件夹start = time.time()videoCapture = cv2.VideoCapture(video_name)print("正在处理视频: "+video_name)fps = videoCapture.get(cv2.CAP_PROP_FPS)  # 获取帧速率(frames per second)video2xlsx(video_name, video_name[:-4], fps)  # 输出在同一目录下的同名文件夹print("视频"+video_name+"已处理完成~")end = time.time()print(f"该视频的处理总用时共计{end-start}秒\n感谢您的使用!")

B站 @符若_float 版本持续更新到满意为止!

免打轴~半自动制作文字类游戏视频的翻译字幕♥ || V1.1 ET/BT Python实例相关推荐

  1. App Store游戏付费榜前三,推荐一款Cocos Creator制作的文字类游戏

    不靠怒刷,不喜宣传,这款基于Cocos Creator制作的文字类游戏「荒野求生」就这样默默无闻地一跃而上,取得了App Store游戏榜前十的好成绩.而且上周还一举挤入游戏付费榜第三.文字类游戏排行 ...

  2. Pygame制作答题类游戏的实现

    代码地址如下: http://www.demodashi.com/demo/13495.html 概述 个人比较喜欢玩这些答题类的游戏,在这类的游戏中其实存在着一些冷知识在里面.练习pygame的过程 ...

  3. python制作闯关答题软件_Pygame制作答题类游戏的实现

    概述 个人比较喜欢玩这些答题类的游戏,在这类的游戏中其实存在着一些冷知识在里面.练习pygame的过程中,在网络上搜索,几乎没有找到这类游戏的示例教程,就蒙生了制作一个答题游戏的念头,最开始的时候,这 ...

  4. unity跑酷怎么添加金币_【Unity3D实战】零基础一步一步教你制作跑酷类游戏(填坑完整版)...

    在两个月前曾写了一篇<[Unity3D实战]零基础一步一步教你制作跑酷类游戏(1)>,里面一步一步演示了制作跑酷类游戏,然而由于时间原因,只写到了让角色往前移动为止.这个坑一直没有时间去填 ...

  5. 【Unity3D实战】零基础一步一步教你制作跑酷类游戏

    原转载自 https://blog.csdn.net/sun15980/article/details/51093048 ,已失效 新 [Unity3D开发小游戏]Unity3D零基础一步一步教你制作 ...

  6. 使用UE4制作RPG类游戏(学习笔记6)(技术笔记5) <刺客信条>

    项目介绍 SLG:策略游戏        SRPG:模拟类角色扮演游戏        FTG:格斗游戏        SPG:体育竞技类游戏        MSC∶音乐游戏        RCG(RA ...

  7. html文字跳动素材,利用文字跳动特效素材制作文字跳动的视频演示教程来了

    文字跳动的视频, 在许多短视频平台都会看到,都很有特点,怎么样,是不是你也想尝试着去制作呢? 文字跳动小视频如果用专业的视频剪辑软件来制作,难度非常高,普通用户是难以制作的,但是利用文字跳动特效素材, ...

  8. pygame制作rpg类游戏或者模拟经营类游戏的思路

    Pygame 能够支持开发 RPG 类或者模拟经营类游戏.Pygame 提供了图形界面.事件处理.音频处理等基础功能,开发者可以利用这些功能实现自己的游戏逻辑. 例如,开发者可以利用 Pygame 实 ...

  9. B2:Unity制作Moba类游戏——聊天系统

    一场游戏对局中,和队友进行友好的有礼貌的有效的沟通可以极大提升对局胜率.在LOL国服,打字和队友聊天沟通战术是非常常见的行为: 语言的力量是无限的,甚至可以和外国小伙伴效沟通战术:     聊天系统制 ...

最新文章

  1. C语言 素数平方之和
  2. 2020年第十五届全国大学生智能汽车竞赛山东赛区成绩统计
  3. 前后端分离之Vue(三)爬过得那些坑
  4. AIX 6.1 连接DS4700,多路径mpio,mpio_get_config -Av 需要打补丁。
  5. 那些让人惊叹的命令执行效果
  6. PostgreSQL内核扩展之 - ElasticSearch同步插件
  7. 遗传算法(GA)实例介绍(JAVA)
  8. 读书印记 - 《刘强东自述:我的经营模式》
  9. 编译原理实验一:单词的词法分析程序设计
  10. XCode中使用SVN 教程
  11. java以太网通讯西门子plc300_3套300PLC之间的以太网通讯
  12. php单链表检测有没有环,PHP找出链表中环入口节点步骤详解
  13. 写给当初的你,现在的我
  14. 使用ASP和ASP.NET来创建文件夹和文件。
  15. matlab 格兰杰,matlab非参数的格兰杰因果分析
  16. win7配置免安装mysql5.6.19过程详解
  17. C语言中文文档、C语言文档大全(网址)
  18. android仿微信联系人索引列表
  19. Python爬虫实例: 爬取“最好大学网”大学排名
  20. virtualbox 的安装和下载

热门文章

  1. 物联网平台正在涌向系统集成
  2. Airsim_API
  3. 一些人工智能网站和工具
  4. 江哥带你玩转C语言 | 15- 修饰符和预处理指令
  5. MySQL笔记:第14章_视图
  6. vue3 setup中props和emit用法
  7. 10个值得推荐的学习编程的网站
  8. 基于Nginx的媒体服务器技术-线上公开课
  9. 虚拟机 ubuntu 无法进入界面
  10. Vim的配置和高级使用