我的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 KeySecret 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 KeySecret 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提取视频中的字幕(文字识别)相关推荐

  1. python 直方图每个bin中的值_使用python中的matplotlib进行绘图分析数据

    matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备, ...

  2. python把汉字变成拼音英文_利用python将表格中的汉字转化为拼音

    GB18030的字符集标准 http://zbgb5.com/2/StandardDetail479488.htm 缺少包时用pip install 进行安装,例如: pip install xlsx ...

  3. python搜索pdf内容所在页码_利用Python在pdf文档中寻找某些词出现的页码

    要研究pdf文件的页码,首先要考虑这个文件的种类.pdf可能是一本书的电子版,可能是一份简历.可能是由Word.PPT或其他文档导出的--如果不是一本书,通常页面内容里是没有页码的:如果是一本书,虽然 ...

  4. python 物理学中的应用_利用python求解物理学中的双弹簧质能系统详解

    前言 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的模型如下: 在这个系统里有两个物体,它们的质 ...

  5. Python办公自动化实战 05 | Python-docx库:Python与Word的完美结合_ 利用代码实现Word中插入图片

    一.专题内容简介 本专题主要介绍Python针对Word办公自动化如何利用Python代码动态向Word中插入图片.​并且对格式做简单设定. 二.专题案例效果 最终运行效果如下: 三.专题代码实现 3 ...

  6. python中读取文本文件_利用Python读取文本文件?

    文件的遍历 因为文件保存了很多字符和行,因此也是循环常见的典型使用案例,最原始的方法可以调用文件对象的read方法,把文件内容一次性加载至字符串对象 file = open('myfile.txt', ...

  7. python二维随机游走_利用python进行时间序列分析——从随机游走到GARCH模型(二)...

    Autoregressive Models - AR(p) 当因变量能由它的多个滞后项表示就叫做自回归性.公式如下: 当我们描述模型的阶数,比如,AR模型的阶数为怕p,p代表在这个模型里用的滞后数量. ...

  8. python计算相关性显著性p值_基于python实现计算两组数据P值

    我们在做A/B试验评估的时候需要借助p_value,这篇文章记录如何利用python计算两组数据的显著性. 一.代码# TTest.py # -*- coding: utf-8 -*- ''' # C ...

  9. python数据库操作批量sql执行_利用Python如何批量修改数据库执行Sql文件

    利用Python如何批量修改数据库执行Sql文件 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  利用Python如何批量修改数据库执行Sql文件.txt ] (友 ...

最新文章

  1. 一位中国博士把整个 CNN 都给可视化了,可交互有细节,每次卷积 ReLU 池化都清清楚楚...
  2. 【DONE】dbeaver不会用,请教!!!
  3. 你可能也看过这个生物学家转行后创造的价值 120 亿美元的动画
  4. 编写Python高质量代码,资深程序员的 91 个建议
  5. 【鲲鹏来了】华为云鲲鹏弹性云服务器 KC1一文全掌握(2)
  6. Linux下数据库mariaDB的管理
  7. android基础入门生命周期(1)
  8. 【一题多解】Python 字符串逆序
  9. hdu 1864 最大报销额 模型为简单的01背包
  10. 我和linux的第十三天
  11. 台式计算机把硬盘换了怎么进系统,联想台式机怎么进bios设置硬盘启动
  12. Centos实现软路由
  13. 鸿蒙系统手机电脑互传文件,【手机篇】巧借局域网,便捷实现手机电脑间的文件传输...
  14. python ssl module_Python升级后ssl模块不可用问题解决和浅析
  15. tinymce富文本编辑器的使用
  16. 全网最详细SUMO仿真软件教程——入门篇
  17. 软件破解中常用API
  18. TCP协议(Socket,ServerSocket)
  19. 使用elasticSearch搭建本地以图搜图服务
  20. python Entry 文本框只能输入数字或限定数字显示

热门文章

  1. 蚂蚁金服大规模分布式事务实践和开源历程
  2. 为什么一定要用MQ中间件
  3. TCP的状态转换及生产问题实操
  4. Linux配置ssh无密码验证,rsync
  5. 小蚂蚁学习Redis笔记(13)——Redis之phpredis的安装
  6. hdu 2871 Memory Control(线段树)
  7. HIT 2634 How to earn more
  8. iPhone5帮助了谁?
  9. sql语句练习(一)
  10. 我们靠什么赢得这个时代