小白学Python之实现OCR识别
作者:coderwangson 发布时间:2022-02-12 20:35:48
目录
前期准备
界面编写
截图功能实现
OCR实现
内容显示
总结
前期准备
在这个阶段主要准备整个小程序的结构,既然要实现ocr,那么输入就是一张图片,而图片这里采用屏幕截图的方式获得,输出是文字,这里采用搜狗的ocr接口,我们把截好的图片传到搜狗ocr接口中,然后把返回的文字作为输出即可。
由于想做一个小程序,所以要为程序做GUI,这里采用tkinter编制GUI界面。
界面编写
界面主要就准备一个窗体,里面有菜单,给出OCR功能。
之后我们点击菜单,则启动一个截图功能,在截图完成后,我们就把截得的图片传入ocr接口并返回文字到主窗体中。
主面板的编写则直接使用tkinter建立菜单等
root = Tk()
root.title("小新的OCR")
# 创建一个顶级菜单
menubar = Menu(root)
# 创建一个下拉菜单“文件”,然后将它添加到顶级菜单中
filemenu = Menu(menubar, tearoff=False)
filemenu.add_command(label="OCR", command=buttonCaptureClick, accelerator='Ctrl+N')
filemenu.add_command(label="帮助",command=helpClick)
filemenu.add_command(label="退出", command=root.quit)
menubar.add_cascade(label="操作", menu=filemenu)
# 显示菜单
root.config(menu=menubar)
root.bind_all("<Control-d>", lambda event: buttonCaptureClick())
#启动消息主循环
root.mainloop()
这样变回产生一个窗体,用户可以和这个窗体进行交互,你可以点击菜单,然后找到其子菜单中的OCR一项,点击它便会调用一个buttonCaptureClick的函数,这个函数就来产生截图,并且保存截图。
截图功能实现
截图功能我也是参考网上的内容,原理就是先把整个屏幕给捕捉到,然后监听鼠标事件,当鼠标左边按下则作为截图的左顶点,鼠标左键松下则最为截图的右底点,这样我们截图区域就出来了,然后进行保存即可。
#用来显示全屏幕截图并响应二次截图的窗口类
class MyCapture:
def __init__(self, png):
#变量X和Y用来记录鼠标左键按下的位置
self.X = tkinter.IntVar(value=0)
self.Y = tkinter.IntVar(value=0)
#屏幕尺寸
screenWidth = root.winfo_screenwidth()
screenHeight = root.winfo_screenheight()
#创建顶级组件容器
self.top = tkinter.Toplevel(root, width=screenWidth, height=screenHeight)
#不显示最大化、最小化按钮
self.top.overrideredirect(True)
self.canvas = tkinter.Canvas(self.top,bg='white', width=screenWidth, height=screenHeight)
#显示全屏截图,在全屏截图上进行区域截图
self.image = tkinter.PhotoImage(file=png)
self.text =""
self.canvas.create_image(screenWidth//2, screenHeight//2, image=self.image)
#鼠标左键按下的位置
def onLeftButtonDown(event):
self.X.set(event.x)
self.Y.set(event.y)
#开始截图
self.sel = True
self.canvas.bind('<Button-1>', onLeftButtonDown)
#鼠标左键移动,显示选取的区域
def onLeftButtonMove(event):
if not self.sel:
return
global lastDraw
try:
#删除刚画完的图形,要不然鼠标移动的时候是黑乎乎的一片矩形
self.canvas.delete(lastDraw)
except Exception as e:
pass
lastDraw = self.canvas.create_rectangle(self.X.get(), self.Y.get(), event.x, event.y, outline='black')
self.canvas.bind('<B1-Motion>', onLeftButtonMove)
#获取鼠标左键抬起的位置,保存区域截图
def onLeftButtonUp(event):
self.sel = False
try:
self.canvas.delete(lastDraw)
except Exception as e:
pass
sleep(0.1)
#考虑鼠标左键从右下方按下而从左上方抬起的截图
left, right = sorted([self.X.get(), event.x])
top, bottom = sorted([self.Y.get(), event.y])
pic = ImageGrab.grab((left+1, top+1, right, bottom))
fileName ="temp.jpg"
pic.save(fileName)
self.text = get_text(fileName)
#关闭当前窗口
self.top.destroy()
self.canvas.bind('<ButtonRelease-1>', onLeftButtonUp)
#让canvas充满窗口,并随窗口自动适应大小
self.canvas.pack(fill=tkinter.BOTH, expand=tkinter.YES)
#开始截图
def buttonCaptureClick():
#最小化主窗口
# root.state('icon')
root.withdraw()
sleep(0.4)
filename = 'temp.png'
#grab()方法默认对全屏幕进行截图
im = ImageGrab.grab()
im.save(filename)
im.close()
#显示全屏幕截图
w = MyCapture(filename)
root.wait_window(w.top)
#截图结束,恢复主窗口,并删除临时的全屏幕截图文件
root.update()
root.deiconify()
text1.config(state = NORMAL)
text1.delete(0.0,END)
text1.insert('insert',w.text)
text1.config(state = DISABLED)
text1.pack()
os.remove(filename)
OCR实现
因为OCR其实是采用了搜狗的接口,所以需要做的工作也不是很多,只需要把我们的图片传入即可。
def get_text(img_path):
print("")
img = img_path # 图片路径
files = {"pic_path": open(img, "rb")} # files # 类似data数据
url = "http://pic.sogou.com/pic/upload_pic.jsp" # post的url
keywords = requests.post(url, files=files).text # requests 提交图片
url = "http://pic.sogou.com/pic/ocr/ocrOnline.jsp?query=" + keywords # keywords就是图片url此方式为get请求
ocrResult = requests.get(url).json() # 直接转换为json格式
contents = ocrResult['result'] # 类似字典 把result的value值取出来 是一个list然后里面很多json就是识别的文字
text = ""
for content in contents: # 遍历所有结果
text+=(content['content'].strip()+'\n') # strip去除空格 他返回的结果自带一个换行
return text
内容显示
内容显示是在截图结束后我们把ocr识别的内容存储起来
self.text = get_text(fileName)
然后再显示到主窗体上
text1.config(state = NORMAL)
text1.delete(0.0,END)
text1.insert('insert',w.text)
text1.config(state = DISABLED)
text1.pack()
总结
虽然是一个完整的项目,但是其中的很多模块其实都是借用其他人的模块,而我做的只是把他们结合起来做成一个小项目,所以是站在巨人的肩膀上开发。
参考:
https://cloud.tencent.com/developer/article/1097904
https://morvanzhou.github.io/tutorials/python-basic/tkinter/
https://www.52pojie.cn/thread-708177-1-1.html
来源:https://blog.csdn.net/qq_28888837/article/details/83475314


猜你喜欢
- Python + opencv 读取视频的三种情况:情况一:通过摄像头采集视频情况二:通过本地视频文件获取视频情况三:通过摄像头录制视频,再
- 对于np.argmax()让我迷惑了很久,尤其是其中的axis=1的比较结果。一、np.argmax()的理解1、最简单的例子假定现在有一个
- 如果你在文件夹里有很多视频,并且文件夹里还有文件夹,文件夹里的文件夹也有视频,怎么能逐个读取并且保存。。所以我写了个代码用了os,walk,
- 相信大家对python-docx这个常用的操作docx文档的库都不陌生,它支持以内联形状(Inline Shape)的形式插入图片,即图片和
- 一.什么是Vuex? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规
- 前言PyTorch是一个开源的深度学习框架,基础教学从开始安装学起,一步一个脚印。提示:以下是本篇文章正文内容,下面案例可供参考一、Pyor
- 开发一个相机应用,需要申请三个权限:相机、读文件、写文件。1、在AndroidManifest.xml中添加<uses-permiss
- 一直以来,我们大多使用js来实现弹出菜单,可是根据 w3c 的css标准,根本就没有这个必要。只需要简单得使用css+html就可以做出一个
- 本文介绍了python opencv之SURF算法示例,分享给大家,具体如下:目标:SURF算法基础opencv总SURF算法的使用原理:上
- 给静态网页加密的方法有很多,有的简单有的复杂。前两天看见有人问静态网页加密问题,就写了这个代码思路:加密时:先把用户的密钥A用md5加密为B
- 0. 前言无论在工作中,还是学习中,都会出现这样子的需求,对某张表进行了排序(按时间排序也好,其他字段排序也罢),然后获取前x行的数据,由于
- 前言本人曾对 Vuex 作过详细介绍,但是今天去回顾的时候发现文章思路有些繁琐,不容易找到重点。于是,在下班前几分钟,我对其重新梳理了一遍。
- 今天彬Go将和大家一起讨论网页设计趋势中很重要的环节,那就是”勾引”用户的按钮。所谓”勾引”用户的按钮,其实对于Web设计师来说,就是如何设
- 1.安装2.操作一个简单的Excel文档操作注释及代码:操作完成后,数据存储结果如下:3. 操作简单Excel文档并添加数据格式操作代码如下
- 大家好,我们的git专题已经更新结束了,所以开始继续给大家写一点设计模式的内容。今天给大家介绍的设计模式非常简单,叫做iterator,也就
- 什么是 go-cachego-cache 是一个轻量级的基于内存的 K-V 储存组件,内部实现了一个线程安全的 map[strin
- 前言在Python中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定
- 问题描述因为项目强制关闭,但是服务还在运行,导致重新运行项目时候 提示地址已经使用(端口被占用)/usr/bin/python3.5 pyt
- A.截取从字符串左边开始N个字符 Declare @S1 varchar(100) Select @S1='http://www.x
- python将a.txt的内容复制到b.txt 中# 1. 用r方式打开a.txtf = open("a.txt",&q