技术标签: python opencv Python ocr
在无数次的996加班后的下午,忽然听见了QQ的震动,我发现有人居然给我发消息~原来是我的妹妹给我发来了消息,内容如下:
她现在正兼职帮学校帮老师配教学视频的字幕,他们配上去了,但是老师又有一个奇怪的想法。哎~ 能不能再从视频中读取字幕出来呢?
我有点为难,犹豫了。
她又说,gie~gie~ 你那么厉害肯定能做出来的!
那我只能路见不平一声吼啊~该出手时就出手,谁让我是gie~gie~呢 !?我来~~~
根据其项目需求我们可列出下列功能:
- 可以读视频
- 识别视频中的文字区域
- 识别区域中的文字信息
由此我们可以得到如下的项目流程
- 确定读取视频的手段,我整体采用的是 python+opencv
- 在字幕区域确认手段中使用 opencv的选区cv.selectROI()函数,手动确认字幕范围
- 在文字识别中我采用的是 pytesseract 技术
须具有opencv开发环境,请自行上网搜寻
推荐搜索:opencv-python详细安装教教程
须具有 tesseract 开发环境,请自行上网搜寻
推荐搜索:pytesseract tesseract-ocr详细安装教教程
在使用tesseract环境时得具有中文识别数据,这个我可以提供。
下载地址:https://wwd.lanzouj.com/i0FRU01vqjoh 密码:c9oz
from PIL import Image
import cv2 as cv
import pytesseract
import threading
def video_handle():
while 1:
name = input("请将本软件与视频放在统一目录下并输入文件名,要有后缀例如 小明.mp4\n并且将会生成字幕文件。\n")
fxy = input("请输入视频显示时缩放程度,建议0.5-0.6 太小的数字识别度不高 例如:0.5\n")
if name == "" and fxy == "":
print("不允许为空")
continue
break
file_name = name
# 获取视频
cap = cv.VideoCapture(r"{}".format(name))
# 初始化帧率控制 左上右下
n = x = y = w = h = 0
# 区域
roi = None
while cap.isOpened():
# cap.read()
# 视频流读取
flag, frame = cap.read()
if flag is False:
break
# 根据输入重设大小
frame = cv.resize(frame, (0, 0), fx=float(fxy), fy=float(fxy))
# 以20的帧率识别
if n % 20 == 0:
# 初始化范围
if n == 0:
if input("输入1则自选区域,建议根据实际视频字幕区域选择,尽量区域选择全面\n") == "1":
# 选择范围框
roi = pic_range(frame)
# 保存位置
x, y, w, h = roi
else:
# 默认选区
x, y, w, h = 405, 971, 1194, 75
print("字幕范围", x, y, w, h)
# 长方形范围框
if n > 0:
cv.rectangle(img=frame, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=2)
# 区域内图像裁剪
range_pic = frame[y:y + h, x:x + w]
# 高斯滤波降噪
throw_nosiy = cv.GaussianBlur(range_pic, (5, 5), 0)
# 灰度
GrayImage = cv.cvtColor(throw_nosiy, cv.COLOR_BGR2GRAY)
# 二值化
ret, thresh = cv.threshold(GrayImage, 127, 255, cv.THRESH_BINARY)
cv.imshow("word", thresh)
cv.imshow("pic", frame)
# 转化为pil图片模式
image = Image.fromarray(cv.cvtColor(thresh, cv.COLOR_BGR2RGB))
# 识别
pic_str(image, file_name)
# q键退出
if ord('q') == cv.waitKey(3):
break
n = n + 1
cv.destroyAllWindows()
# 释放摄像头
cap.release()
def pic_str(image, file_name):
# tesseract ocr
chi_text = pytesseract.image_to_string(image, lang="chi_sim")
# 移除多余的空格与换行
chi_text = chi_text.replace(" ", "").replace("\n", "")
if chi_text != "":
print(chi_text)
# 创建进程写入
thread = threading.Thread(target=file_save, args=(chi_text, file_name))
thread.start()
在此处我原本想让他自动识别字幕的,看的人多的话我就做~~
def pic_range(img):
# 范围选择
roi = cv.selectROI(windowName="roi", img=img, showCrosshair=True, fromCenter=False)
cv.destroyAllWindows()
return roi
def file_save(chi_text, file_name):
with open("{}.txt".format(file_name), "a+") as f:
f.write(chi_text + "\n")
使用了pyinstaller将其打包成exe便于妹妹使用~
这波效果直接拉满好吧~
妹妹的鼓励才是生产的第一动力!!!
若是有代码方面的问题,评论区交流~~~看到了就会回。
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数