免打轴~半自动制作文字类游戏视频的翻译字幕♥ || V1.1 ET/BT Python实例
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实例相关推荐
- App Store游戏付费榜前三,推荐一款Cocos Creator制作的文字类游戏
不靠怒刷,不喜宣传,这款基于Cocos Creator制作的文字类游戏「荒野求生」就这样默默无闻地一跃而上,取得了App Store游戏榜前十的好成绩.而且上周还一举挤入游戏付费榜第三.文字类游戏排行 ...
- Pygame制作答题类游戏的实现
代码地址如下: http://www.demodashi.com/demo/13495.html 概述 个人比较喜欢玩这些答题类的游戏,在这类的游戏中其实存在着一些冷知识在里面.练习pygame的过程 ...
- python制作闯关答题软件_Pygame制作答题类游戏的实现
概述 个人比较喜欢玩这些答题类的游戏,在这类的游戏中其实存在着一些冷知识在里面.练习pygame的过程中,在网络上搜索,几乎没有找到这类游戏的示例教程,就蒙生了制作一个答题游戏的念头,最开始的时候,这 ...
- unity跑酷怎么添加金币_【Unity3D实战】零基础一步一步教你制作跑酷类游戏(填坑完整版)...
在两个月前曾写了一篇<[Unity3D实战]零基础一步一步教你制作跑酷类游戏(1)>,里面一步一步演示了制作跑酷类游戏,然而由于时间原因,只写到了让角色往前移动为止.这个坑一直没有时间去填 ...
- 【Unity3D实战】零基础一步一步教你制作跑酷类游戏
原转载自 https://blog.csdn.net/sun15980/article/details/51093048 ,已失效 新 [Unity3D开发小游戏]Unity3D零基础一步一步教你制作 ...
- 使用UE4制作RPG类游戏(学习笔记6)(技术笔记5) <刺客信条>
项目介绍 SLG:策略游戏 SRPG:模拟类角色扮演游戏 FTG:格斗游戏 SPG:体育竞技类游戏 MSC∶音乐游戏 RCG(RA ...
- html文字跳动素材,利用文字跳动特效素材制作文字跳动的视频演示教程来了
文字跳动的视频, 在许多短视频平台都会看到,都很有特点,怎么样,是不是你也想尝试着去制作呢? 文字跳动小视频如果用专业的视频剪辑软件来制作,难度非常高,普通用户是难以制作的,但是利用文字跳动特效素材, ...
- pygame制作rpg类游戏或者模拟经营类游戏的思路
Pygame 能够支持开发 RPG 类或者模拟经营类游戏.Pygame 提供了图形界面.事件处理.音频处理等基础功能,开发者可以利用这些功能实现自己的游戏逻辑. 例如,开发者可以利用 Pygame 实 ...
- B2:Unity制作Moba类游戏——聊天系统
一场游戏对局中,和队友进行友好的有礼貌的有效的沟通可以极大提升对局胜率.在LOL国服,打字和队友聊天沟通战术是非常常见的行为: 语言的力量是无限的,甚至可以和外国小伙伴效沟通战术: 聊天系统制 ...
最新文章
- C语言 素数平方之和
- 2020年第十五届全国大学生智能汽车竞赛山东赛区成绩统计
- 前后端分离之Vue(三)爬过得那些坑
- AIX 6.1 连接DS4700,多路径mpio,mpio_get_config -Av 需要打补丁。
- 那些让人惊叹的命令执行效果
- PostgreSQL内核扩展之 - ElasticSearch同步插件
- 遗传算法(GA)实例介绍(JAVA)
- 读书印记 - 《刘强东自述:我的经营模式》
- 编译原理实验一:单词的词法分析程序设计
- XCode中使用SVN 教程
- java以太网通讯西门子plc300_3套300PLC之间的以太网通讯
- php单链表检测有没有环,PHP找出链表中环入口节点步骤详解
- 写给当初的你,现在的我
- 使用ASP和ASP.NET来创建文件夹和文件。
- matlab 格兰杰,matlab非参数的格兰杰因果分析
- win7配置免安装mysql5.6.19过程详解
- C语言中文文档、C语言文档大全(网址)
- android仿微信联系人索引列表
- Python爬虫实例: 爬取“最好大学网”大学排名
- virtualbox 的安装和下载