近期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工具相关推荐

  1. python必背100代码-100行Python代码实现一款高精度免费OCR工具

    近期Github开源了一款基于Python开发.名为 Textshot 的截图工具,刚开源不到半个月已经500+Star. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本 ...

  2. 100行Python代码实现一款高精度免费OCR工具

    近期Github开源了一款基于Python开发.名为 Textshot 的截图工具,刚开源不到半个月已经500+Star. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本 ...

  3. python必背100源代码-100行Python代码实现一款高精度免费OCR工具

    近期Github开源了一款基于Python开发.名为Textshot的截图工具,刚开源不到半个月已经500+Star. 这两天抽空看了一下Textshot的源码,的确是一个值得介绍的项目. 相对于大多 ...

  4. python必背100源代码下载-100行Python代码实现一款高精度免费OCR工具

    近期Github开源了一款基于Python开发.名为Textshot的截图工具,刚开源不到半个月已经500+Star. 这两天抽空看了一下Textshot的源码,的确是一个值得介绍的项目. 相对于大多 ...

  5. c语言微信挑一挑编程,100行python代码实现微信跳一跳辅助程序

    写在前面 分享一下今天下午用python写的"跳一跳"小游戏的辅助程序.之前是准备用树莓派操控一个"机械手指"来代替人的触摸操作,但该方案还在酝酿中,实现了再分 ...

  6. python pdf编辑开发_20行Python代码实现一款永久免费PDF编辑工具的实现

    PDF(Portable Document Format),中文名称便携文档格式是我们经常会接触到的一种文件格式,文献.文档...很多都是PDF格式.它以格式稳定的优势,使得我们在打印.分享.传输过程 ...

  7. 100行python代码做一个程序_100行python代码实现微信跳一跳辅助程序

    写在前面 分享一下今天下午用python写的"跳一跳"小游戏的辅助程序.之前是准备用树莓派操控一个"机械手指"来代替人的触摸操作,但该方案还在酝酿中,实现了再分 ...

  8. 100个必会的python脚本-100行Python代码实现自动抢火车票(附源码)

    前言 又要过年了,今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool.下面话不多说了,来一起看看详细的介绍吧. 先准备好: 12306网站用户名和密码 chrome浏览器及下载chromedr ...

  9. python模拟别人说话的声音_如何用100行Python代码做出魔性声控游戏“八分音符酱”...

    最近几天,一款魔性的小游戏在微博上刷屏了,各大平台的主播也纷纷如感染病毒一样直播自己怎么玩这个游戏(被游戏玩). 这个游戏叫做<不要停!八分音符酱♪>.它是一款来自岛国的恶搞游戏,主角是一 ...

最新文章

  1. 成功解决ERROR: Unable to find the development tool `make` in your path; please make sure that you have t
  2. h3c服务器 raid 型号,H3C服务器创建Raid
  3. 【医院综合管理专题】医院服务质量管理制度与规范
  4. 容器映像_构建微小的容器映像
  5. java中什么是底层数据结构_JavaScript 对象的底层数据结构是什么
  6. .NET正则基础之——平衡组
  7. mysql用大白话解释_大白话 golang 教程-22-关系型数据库访问
  8. 如何提高Visual Studio编译速度
  9. 两表查询很慢mysql_影响mysql性能的方面
  10. MSP430之自动增益程控放大main备份
  11. 流程图中的实线_绘制工艺流程图就这么简单(附工艺流程图常见符号)
  12. 把Wordpress集成到zen-cart里方法 各种修改 经典机制
  13. 不同业务场景该如何选择缓存的读写策略?
  14. 我的职业生涯(五) 告别六天工作制
  15. HBuilder X 中使用模拟器进行App开发
  16. 信息技术服务风险评估
  17. 高质量程序设计指南C/C++阅读笔记
  18. 什么是GLEW GLFW GLM
  19. mysql前一天的数据_mysql查询前一天数据-mysql根据时间查询前一天数据-吾爱编程网...
  20. DB4AI:使能数据库原生AI计算,助力数据湖场景业务成功

热门文章

  1. 计算机二级密码不正确的是什么情况,方法不对努力白费:计算机二级备考正确方向是什么...
  2. 2022年最新山西水利水电施工安全员模拟试题题库及答案
  3. 单片机系列之--入门技术
  4. 区块链技术中的那些能商用的企业级应用
  5. 驱控系统的控制协议及方式
  6. 让简历一发即中三大绝招
  7. 轮询的时候,总是报500服务器无法处理大量的请求
  8. mysql自动排序_MySQL中的排序
  9. 可以录制手机尺寸的录屏软件有哪些?
  10. 搭建一个独立网站用什么软件或系统?