python免费ocr软件_Textshot:100行Python代码实现一款高精度免费OCR工具
近期Github开源了一款基于Python开发,名为Textshot的截图工具,刚开源不不久已经800+Star。
相对于大多数OCR工具复杂工程、差强人意的效果,Textshot具有明显的优势:项目简单和技术点丰富
项目简单
Textshot整个项目只有1个Python文件、139行代码,没有复杂的第三方库应用,也不涉及过多后端算法的调用。
技术点丰富
Textshot这个项目虽然只有短短的139行代码,但是,却涉及Python中多个方面的知识应用:
(1)UI开发
(2)截图工具开发
(3)后端引擎调用
通过这短短的项目,你不仅可以了解如何利用PyQt5实现一个用户界面,还可以学会如何使用pyscreenshot开发一款自己的截图工具。此外,还能够学会后端tesseract的调用。
换句话说,这短短的139行代码囊括了前端至后端的整个流程,而且涉及到截图和OCR两款工具的衔接。因此,Textshot虽然工程不大,却是一个非常完备、值得学习的项目。
tesseract
目前OCR工具数不胜数,但是大多数都是在相同的后端算法上面进行了不同的封装而已。而真正在OCR核心做的较好、值得大书特书的,那么一定非tesseract莫属。
tesseract早在1985就已经开始由HP实验室开始研发,而在1995年更是被评为最为准确的3款OCR工具之一。此后,tesseract被开源,经过Google对其不断的进行优化和升级,它目前已经成为OCR方面一款标杆性的工具。很多开源或者付费的OCR工具,都是直接调用tesseract或者对其进行稍许优化。
而今天介绍的Textshot就是直接调用tesseract后端引擎进行OCR识别。因此,Textshot只是实现了一款截图工具,起到前后端的串联作用,在OCR识别算法方面并没有做任何工作。
Textshot是一款截图识别文字的OCR工具,因此,它主要涉及2个环境:截图和OCR识别。
Textshot首先通过截图获取需要进行文字识别的图像,然后对这副图像进行OCR文字识别,输出识别结果。Textshot的OCR识别阶段调用的是tesseract,所以只需要1行代码即可完成。因此,Textshot的工作主要是围绕前端窗口和截图工具的实现方面。
截图工具
截图工具是我们经常会用到的一种工具,如何实现一款截图工具?很多人会把它想的非常复杂,其实,Python中有很多可以实现截图的库或者函数,例如,pyscreenshot或者pillow中的ImageGrab函数,它的调用方式如下,shot = ImageGrab.grab(bbox=(x1, y1, x2, y2))
也就是说,我们只需要把鼠标框选的起点和终点坐标传给grab方法就可以实现截图功能。
那么,现在问题就转化为如何获取鼠标框选的起点和终点?
Textshot通过调用PyQt5并继承QWidget来实现鼠标框选过程中的一些方法来获取框选的起点和终点。
Textshot继承和重写QWidget方法主要包括如下几个,keyPressEvent(self, event):键盘响应函数
paintEvent(self, event):UI绘制函数
mousePressEvent(self, event):鼠标点击事件
mouseMoveEvent(self, event):鼠标移动事件
mouseReleaseEvent(self, event):鼠标释放事件
可以看出,上面重写的方法以及囊括了截图过程中涉及的各个动作:(1)点击鼠标(2)拖动、绘制截图框(3)释放鼠标class Snipper(QtWidgets.QWidget):
def __init__(self, parent=None, flags=Qt.WindowFlags()):
super().__init__(parent=parent, flags=flags)
self.setWindowTitle("TextShot")
self.setWindowFlags(
Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Dialog
)
self.is_macos = sys.platform.startswith("darwin")
if self.is_macos:
self.setWindowState(self.windowState() | Qt.WindowMaximized)
else:
self.setWindowState(self.windowState() | Qt.WindowFullScreen)
self.setStyleSheet("background-color: black")
self.setWindowOpacity(0.5)
QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor))
self.start, self.end = QtCore.QPoint(), QtCore.QPoint()
def keyPressEvent(self, event):
if event.key() == Qt.Key_Escape:
QtWidgets.QApplication.quit()
return super().keyPressEvent(event)
def paintEvent(self, event):
if self.start == self.end:
return super().paintEvent(event)
painter = QtGui.QPainter(self)
painter.setPen(QtGui.QPen(QtGui.QColor(255, 255, 255), 3))
painter.setBrush(QtGui.QColor(255, 255, 255, 100))
if self.is_macos:
start, end = (self.mapFromGlobal(self.start), self.mapFromGlobal(self.end))
else:
start, end = self.start, self.end
painter.drawRect(QtCore.QRect(start, end))
return super().paintEvent(event)
def mousePressEvent(self, event):
self.start = self.end = QtGui.QCursor.pos()
self.update()
return super().mousePressEvent(event)
def mouseMoveEvent(self, event):
self.end = QtGui.QCursor.pos()
self.update()
return super().mousePressEvent(event)
def mouseReleaseEvent(self, event):
if self.start == self.end:
return super().mouseReleaseEvent(event)
x1, x2 = sorted((self.start.x(), self.end.x()))
y1, y2 = sorted((self.start.y(), self.end.y()))
然后启动截图界面,QtCore.QCoreApplication.setAttribute(Qt.AA_DisableHighDpiScaling)
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QMainWindow()
snipper = Snipper(window)
snipper.show()
用户拖动、框选窗口,会获取窗口的起点和终点的坐标,这时候可以调用下面语句进行截图,获取需要OCR识别的文本图像,shot = ImageGrab.grab(bbox=(x1, y1, x2, y2))
OCR文字识别
通过ImageGrab.grab截取到文本图像shot,下一步就是要把图像内容输入给后端的tesseract引擎,让它把图像转化为字符串result = pytesseract.image_to_string(img, timeout=2, lang=(sys.argv[1] if len(sys.argv) > 1 else None))
到这里,就实现了一款准确度高、永久免费的OCR工具。
回顾一下Textshot的项目,我们会发现截图坐标范围内的图像、OCR识别只需要2行代码,大多数都是在围绕获取窗口起点和终点坐标在开发。换句话说,Textshot这个项目对OCR核心部分并没有做任何更改,只是在产品包装方面做了一些巧妙的工作。
参考
python免费ocr软件_Textshot:100行Python代码实现一款高精度免费OCR工具相关推荐
- python必背100代码-100行Python代码实现一款高精度免费OCR工具
近期Github开源了一款基于Python开发.名为 Textshot 的截图工具,刚开源不到半个月已经500+Star. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本 ...
- 100行Python代码实现一款高精度免费OCR工具
近期Github开源了一款基于Python开发.名为 Textshot 的截图工具,刚开源不到半个月已经500+Star. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本 ...
- python必背100源代码-100行Python代码实现一款高精度免费OCR工具
近期Github开源了一款基于Python开发.名为Textshot的截图工具,刚开源不到半个月已经500+Star. 这两天抽空看了一下Textshot的源码,的确是一个值得介绍的项目. 相对于大多 ...
- python必背100源代码下载-100行Python代码实现一款高精度免费OCR工具
近期Github开源了一款基于Python开发.名为Textshot的截图工具,刚开源不到半个月已经500+Star. 这两天抽空看了一下Textshot的源码,的确是一个值得介绍的项目. 相对于大多 ...
- c语言微信挑一挑编程,100行python代码实现微信跳一跳辅助程序
写在前面 分享一下今天下午用python写的"跳一跳"小游戏的辅助程序.之前是准备用树莓派操控一个"机械手指"来代替人的触摸操作,但该方案还在酝酿中,实现了再分 ...
- python pdf编辑开发_20行Python代码实现一款永久免费PDF编辑工具的实现
PDF(Portable Document Format),中文名称便携文档格式是我们经常会接触到的一种文件格式,文献.文档...很多都是PDF格式.它以格式稳定的优势,使得我们在打印.分享.传输过程 ...
- 100行python代码做一个程序_100行python代码实现微信跳一跳辅助程序
写在前面 分享一下今天下午用python写的"跳一跳"小游戏的辅助程序.之前是准备用树莓派操控一个"机械手指"来代替人的触摸操作,但该方案还在酝酿中,实现了再分 ...
- 100个必会的python脚本-100行Python代码实现自动抢火车票(附源码)
前言 又要过年了,今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool.下面话不多说了,来一起看看详细的介绍吧. 先准备好: 12306网站用户名和密码 chrome浏览器及下载chromedr ...
- python模拟别人说话的声音_如何用100行Python代码做出魔性声控游戏“八分音符酱”...
最近几天,一款魔性的小游戏在微博上刷屏了,各大平台的主播也纷纷如感染病毒一样直播自己怎么玩这个游戏(被游戏玩). 这个游戏叫做<不要停!八分音符酱♪>.它是一款来自岛国的恶搞游戏,主角是一 ...
最新文章
- 成功解决ERROR: Unable to find the development tool `make` in your path; please make sure that you have t
- h3c服务器 raid 型号,H3C服务器创建Raid
- 【医院综合管理专题】医院服务质量管理制度与规范
- 容器映像_构建微小的容器映像
- java中什么是底层数据结构_JavaScript 对象的底层数据结构是什么
- .NET正则基础之——平衡组
- mysql用大白话解释_大白话 golang 教程-22-关系型数据库访问
- 如何提高Visual Studio编译速度
- 两表查询很慢mysql_影响mysql性能的方面
- MSP430之自动增益程控放大main备份
- 流程图中的实线_绘制工艺流程图就这么简单(附工艺流程图常见符号)
- 把Wordpress集成到zen-cart里方法 各种修改 经典机制
- 不同业务场景该如何选择缓存的读写策略?
- 我的职业生涯(五) 告别六天工作制
- HBuilder X 中使用模拟器进行App开发
- 信息技术服务风险评估
- 高质量程序设计指南C/C++阅读笔记
- 什么是GLEW GLFW GLM
- mysql前一天的数据_mysql查询前一天数据-mysql根据时间查询前一天数据-吾爱编程网...
- DB4AI:使能数据库原生AI计算,助力数据湖场景业务成功