python 替换array中的值_利用Python提取视频中的字幕(文字识别)
我的CSDN博客id:qq_39783601,昵称是糖潮丽子~辣丽
从今天开始我会陆续将数据分析师相关的知识点分享在这里,包括Python、机器学习、数据库等等。
今天来分享一个Python小项目!
文字识别
- 项目背景
- 需求阐述
- 思路
- 首先导包
- 代码详情
- 裁剪视频
- 创建文本
- 判断中文
- 截取字幕
- 访问百度API
- 读取图片&字幕操作
- 主方法控制台输出运行
项目背景
通过获取百度API实现视频文字识别。
需求阐述
将.MP4格式视频裁剪成一帧一帧的图片再将图片中的字幕摘取出来,保存成一个文档。
进入正题喽!!!
思路
1.将视频按帧截取成图片
2.将上一步截取的图片再进行裁剪,只保留字幕部分,然后在进行灰度处理
3.调用百度api识别文字
4.输出成txt
首先导包
# base64是一种将不可见字符转换为可见字符的编码方式
import base64
# opencv是跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法
import osimport cv2
import requests
from aip import AipOcr
# 百度AI的文字识别库
base64
base64是一种将不可见字符转换为可见字符的编码方式。
opencv
是跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。
AipOcr
百度AI的文字识别库。
注意:这里from aip import AipOcr刚开始可能会报错,原因可能是aip和baidu-aip根本不是同一个包,如果想要import的时候,都是使用:import aip 之后pip install baidu-aip就没报错了。
代码详情
裁剪视频
def tailor_video():# 要提取视频的文件名,隐藏后缀sourceFileName = 'material'# 在这里把后缀接上video_path = os.path.join("G:/material/", sourceFileName + '.mp4')times = 0# 提取视频的频率,每10帧提取一个frameFrequency = 10# 输出图片到当前目录video文件夹下outPutDirName = 'G:/material/video/' + sourceFileName + '/'if not os.path.exists(outPutDirName):# 如果文件目录不存在则创建目录os.makedirs(outPutDirName)camera = cv2.VideoCapture(video_path)while True:times += 1res, image = camera.read()if not res:print('not res , not image')breakif times % frameFrequency == 0:cv2.imwrite(outPutDirName + str(times) + '.jpg', image) #文件目录下将输出的图片名字命名为10.jpg这种形式print(outPutDirName + str(times) + '.jpg')print('图片提取结束')
这里定义一个函数用来裁剪视频。
我们需要将视频裁剪成一帧一帧的图片,将图片保存成10.jpg这种形式,并且将这些裁剪后的图片放在一个目录下。
这里我设置的是每10帧裁剪一张,你也可以任意设置多少帧裁剪。
视频裁剪后的图片效果:
创建文本
def text_create(name, msg):desktop_path = "G:/material/" # 新创建的txt文件的存放路径full_path = desktop_path + name + '.txt' # 也可以创建一个.doc的word文档file = open(full_path, 'w')file.write(msg)file.close()
这里创建一个函数,用来存放提取后的文字信息。
创建.txt文本存放提取后的文字。
判断中文
# 定义一个函数,用来判断是否是中文,是中文的话就返回True代表要提取中文字幕
def is_Chinese(word):for ch in word:if 'u4e00' <= ch <= 'u9fff':return Truereturn False
定义一个函数,用来判断是否是中文,是中文的话就返回True代表要提取中文字幕,不是中文的就返回False。
截取字幕
def tailor(path1,path2,begin,end,step_size): #截取字幕for i in range(begin,end,step_size):fname1=path1 % str(i)print(fname1)img = cv2.imread(fname1)print(img.shape)cropped = img[500:600, 100:750] # 裁剪坐标为[y0:y1, x0:x1]imgray = cv2.cvtColor(cropped, cv2.COLOR_BGR2GRAY)thresh = 200ret, binary = cv2.threshold(imgray, thresh, 255, cv2.THRESH_BINARY) # 输入灰度图,输出二值图binary1 = cv2.bitwise_not(binary) # 取反cv2.imwrite(path2 % str(i), binary1)
对字幕进行灰度处理,目的是使截取的字幕更加清晰。
如下效果:
裁剪视频得到的图片(其一):
截取字幕后:
进行灰度处理后:
对于灰度处理,二值化处理不明白的可以参考如下文章。
基本的阈值操作 - OpenCV 2.3.2 documentation
Opencv之图像固定阈值二值化处理threshold_人工智能_qq_37385726的博客-CSDN博客
访问百度API
# 定义一个函数,用来访问百度API,
def requestApi(img):request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"params = {"image": img,'language_type':'CHN_ENG'}access_token = '24.b802cd212b0e702b018f999c594b6d9f.2592000.1589466832.282335-19430506'request_url = request_url + "?access_token=" + access_tokenheaders = {'content-type': 'application/x-www-form-urlencoded'}response = requests.post(request_url, data=params, headers=headers)results=response.json()return results
这里的access_token
是这么来的:
首先你需要百度搜索:百度ocr—— 点击文字识别
第二步:点击立即使用
第三步:创建应用
第四步:随便填写一个名称,然后立即创建。
创建成功后你就会看到你刚才创建的一个应用test。
此时,我们需要这里的API Key
和Secret Key
两个参数中的内容,用来获取access_token
的内容。
接下来第五步点击技术文档
第六步:点击通用文字识别
这里有access_token相关的介绍,可以点击Access Token获取查看详情。
详情介绍了如何获取Access Token。
复制下面链接到浏览器:
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2&
替换对应如下的内容,就是上面创建应用test后得到的API Key
和Secret Key
两个参数中的内容,对应替换。
替换后回车就会得到:access Token的值。
其他代码中剩余的参数可以自行设置。
读取图片&字幕操作
def get_file_content(filePath):with open(filePath, 'rb') as fp:# 将读取出来的图片转换为b64encode编码格式return base64.b64encode(fp.read())
# 定义函数字幕,用来对字幕进行操作
# step_size 步长
def subtitle(fname,begin,end,step_size):array =[] #定义一个数组用来存放wordsfor i in range(begin,end,step_size): #begin开始,end结束,循环按照步长step_size遍历,共有419张图片,也就是(1,420,10)fname1=fname % str(i)print(fname1)image = get_file_content(fname1)try:results=requestApi(image)['words_result'] #调用requestApi函数,获取json字符串中的words_resultfor item in results:print(results)if is_Chinese(item['words']):array.append(item['words'].replace('猎奇笔记本', '')) # 将图片中不需要的字幕“猎奇笔记本”替换为空except Exception as e:print(e)text=''result = list(set(array)) # 将array数组准换为一个无序不重复元素集达到去重的效果,再转为列表result.sort(key=array.index) # 利用sort将数组中的元素即字幕重新排序,达到视频播放字幕的顺序for item in result:print(item)text+=item+'n'text_create('test1',text)
首先需要对读取到的图片进行转码,转为b64encode编码格式。
其中,在图片识别时候可能会识别到除字幕外的文字,我们还需要将图片中不需要的文字替换为空,只获取字幕。
例如:此处我们需要将“猎奇笔记本”替换为空。
主方法控制台输出运行
if __name__ =="__main__":path1 = 'G:/material/video/img/%s.jpg' # 视频转为图片存放的路径(帧)path2 = 'G:/material/video/img2/%s.jpg' # 图片截取字幕后存放的路径print("""1.图片裁剪2.提取字幕3.裁剪视频""")choose=input()begin=100end=1000step_size=10if choose=='1':tailor(path1,path2,begin,end,step_size)if choose=='2':subtitle(path2,begin,end,step_size)if choose=='3':tailor_video()
结果:
结果中精确度还不是很高,不过80%的文字都提取到了还算可以哦。这次只是做了一个小小的练习,代码还可以继续优化,获取到的字幕还能够更加准确哦。
原文链接:利用Python提取视频中的字幕(文字识别)_python_qq_39783601的博客-CSDN博客
python 替换array中的值_利用Python提取视频中的字幕(文字识别)相关推荐
- python 直方图每个bin中的值_使用python中的matplotlib进行绘图分析数据
matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备, ...
- python把汉字变成拼音英文_利用python将表格中的汉字转化为拼音
GB18030的字符集标准 http://zbgb5.com/2/StandardDetail479488.htm 缺少包时用pip install 进行安装,例如: pip install xlsx ...
- python搜索pdf内容所在页码_利用Python在pdf文档中寻找某些词出现的页码
要研究pdf文件的页码,首先要考虑这个文件的种类.pdf可能是一本书的电子版,可能是一份简历.可能是由Word.PPT或其他文档导出的--如果不是一本书,通常页面内容里是没有页码的:如果是一本书,虽然 ...
- python 物理学中的应用_利用python求解物理学中的双弹簧质能系统详解
前言 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的模型如下: 在这个系统里有两个物体,它们的质 ...
- Python办公自动化实战 05 | Python-docx库:Python与Word的完美结合_ 利用代码实现Word中插入图片
一.专题内容简介 本专题主要介绍Python针对Word办公自动化如何利用Python代码动态向Word中插入图片.并且对格式做简单设定. 二.专题案例效果 最终运行效果如下: 三.专题代码实现 3 ...
- python中读取文本文件_利用Python读取文本文件?
文件的遍历 因为文件保存了很多字符和行,因此也是循环常见的典型使用案例,最原始的方法可以调用文件对象的read方法,把文件内容一次性加载至字符串对象 file = open('myfile.txt', ...
- python二维随机游走_利用python进行时间序列分析——从随机游走到GARCH模型(二)...
Autoregressive Models - AR(p) 当因变量能由它的多个滞后项表示就叫做自回归性.公式如下: 当我们描述模型的阶数,比如,AR模型的阶数为怕p,p代表在这个模型里用的滞后数量. ...
- python计算相关性显著性p值_基于python实现计算两组数据P值
我们在做A/B试验评估的时候需要借助p_value,这篇文章记录如何利用python计算两组数据的显著性. 一.代码# TTest.py # -*- coding: utf-8 -*- ''' # C ...
- python数据库操作批量sql执行_利用Python如何批量修改数据库执行Sql文件
利用Python如何批量修改数据库执行Sql文件 来源:中文源码网 浏览: 次 日期:2018年9月2日 [下载文档: 利用Python如何批量修改数据库执行Sql文件.txt ] (友 ...
最新文章
- 一位中国博士把整个 CNN 都给可视化了,可交互有细节,每次卷积 ReLU 池化都清清楚楚...
- 【DONE】dbeaver不会用,请教!!!
- 你可能也看过这个生物学家转行后创造的价值 120 亿美元的动画
- 编写Python高质量代码,资深程序员的 91 个建议
- 【鲲鹏来了】华为云鲲鹏弹性云服务器 KC1一文全掌握(2)
- Linux下数据库mariaDB的管理
- android基础入门生命周期(1)
- 【一题多解】Python 字符串逆序
- hdu 1864 最大报销额 模型为简单的01背包
- 我和linux的第十三天
- 台式计算机把硬盘换了怎么进系统,联想台式机怎么进bios设置硬盘启动
- Centos实现软路由
- 鸿蒙系统手机电脑互传文件,【手机篇】巧借局域网,便捷实现手机电脑间的文件传输...
- python ssl module_Python升级后ssl模块不可用问题解决和浅析
- tinymce富文本编辑器的使用
- 全网最详细SUMO仿真软件教程——入门篇
- 软件破解中常用API
- TCP协议(Socket,ServerSocket)
- 使用elasticSearch搭建本地以图搜图服务
- python Entry 文本框只能输入数字或限定数字显示