近期Github开源了一款基于Python开发、名为Textshot的截图工具,刚开源不到半个月已经500+Star。

这两天抽空看了一下Textshot的源码,的确是一个值得介绍的项目。

相对于大多数OCR工具复杂工程、差强人意的效果,Textshot具有明显的优势,

项目简单

技术点丰富

项目简单

Textshot整个项目只有1个Python文件、139行代码,没有复杂的第三方库应用,也不涉及过多后端算法的调用。

技术点丰富

Textshot这个项目虽然只有短短的139行代码,但是,却涉及Python中多个方面的知识应用,

UI开发

截图工具开发

后端引擎调用

通过这短短的项目,你不仅可以了解如何利用PyQt5实现一个用户界面,还可以学会如何使用pyscreenshot开发一款自己的截图工具。此外,还能够学会后端tesseract的调用。

换句话说,这短短的139行代码囊括了前端至后端的整个流程,而且涉及到截图和OCR两款工具的衔接。因此,Textshot虽然工程不大,却是一个非常完备、值得学习的项目。

本文就来剖析这个项目的源代码,教你一步一步实现自用且永久免费的截图&OCR工具!

tesseract

目前OCR工具数不胜数,但是大多数都是在相同的后端算法上面进行了不同的封装而已。而真正在OCR核心做的较好、值得大书特书的,那么一定非tesseract莫属

tesseract早在1985就已经开始由HP实验室开始研发,而在1995年更是被评为最为准确的3款OCR工具之一。此后,tesseract被开源,经过Google对其不断的进行优化和升级,它目前已经成为OCR方面一款标杆性的工具。很多开源或者付费的OCR工具,都是直接调用tesseract或者对其进行稍许优化。

而今天介绍的Textshot就是直接调用tesseract后端引擎进行OCR识别。因此,Textshot只是实现了一款截图工具,起到前后端的串联作用,在OCR识别算法方面并没有做任何工作。

tesseract安装

由于Textshot的OCR识别需要调用tesseract后端引擎,所以,首先需要安装tesseract。

Windows版安装可以直接访问下载链接[1].

Mac下可以使用Homebrew进行安装,

brew install tesseract

Textshot

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):鼠标释放事件

可以看出,上面重写的方法以及囊括了截图过程中涉及的各个动作,

点击鼠标

拖动、绘制截图框

释放鼠标

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核心部分并没有做任何更改,只是在产品包装方面做了一些巧妙的工作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持云海天教程。

原文链接:https://www.cnblogs.com/guran0823/p/13131134.html

python 高精度时间_如何基于Python代码实现高精度免费OCR工具相关推荐

  1. 如何用python制作动画_如何基于Python Matplotlib实现网格动画

    -1- 如果你对本文的代码感兴趣,可以去 Github (文末提供)里查看.第一次运行的时候会报一个错误(还没找到解决办法),不过只要再运行一次就正常了. 这篇文章虽然不是篇典型的数据科学类文章,不过 ...

  2. python web论坛_十个基于Python的BBS论坛类开源web框架汇总(附源码地址)

    1.LBForum LBForum是用django开发的论坛系统,LBForum主要注重部署的方便性和易用性,功能方面目前还比较简单. LBForum的开发尽量遵照Django可复用app原则,因此即 ...

  3. python bbs论坛_十个基于Python的BBS论坛类开源web框架汇总(附源码地址)

    1.LBForum LBForum是用django开发的论坛系统,LBForum主要注重部署的方便性和易用性,功能方面目前还比较简单. LBForum的开发尽量遵照Django可复用app原则,因此即 ...

  4. 计算机科学与python编程导论_【基于Python】MIT OCW 计算机科学与编程导论

    [基于Python]MIT OCW 计算机科学与编程导论 (MIT Course Number 6.0001)Introduction to Computer Science and Programm ...

  5. 高等数学与python高级应用_高等数学——基于Python的实现

    商品详情 书名:高等数学--基于Python的实现 定价:45.8 ISBN:9787121382437 作者:官金兰 版次:第1版 出版时间:2020-07 内容提要: 本书旨在用通俗易懂的语言介绍 ...

  6. python扫雷算法_如何基于Python实现自动扫雷

    这篇文章主要介绍了如何基于Python实现自动扫雷,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 自动扫雷一般分为两种,一种是读取内存数据,而另一种 ...

  7. python自动记录时间_如何使用python记录室友的抖音在线时间

    今天给大家分享一篇有趣的文章,灵感来自于前几天与室友的聊天,他告诉我抖音可以实时显示人的在线情况,如下图: 只需要进入抖音消息框,然后进入用户聊天窗口,就可以看到上述在线状态了. 然后我灵机一动,是不 ...

  8. python 抽奖器_如何基于python实现年会抽奖工具

    用python来实现一个抽奖程序,供大家参考,具体内容如下 主要功能有 1.从一个csv文件中读入所有员工工号 2.将这些工号初始到一个列表中 3.用random模块下的choice函数来随机选择列表 ...

  9. python word排版_如何基于Python实现word文档重新排版

    介绍 舍友从网上下载的word题库文档很乱,手动改了大半天才改了一点,想起python是大名鼎鼎的自动化脚本,于是乎开始了python对word的一顿瞎操作. 分析需求 对文档中的内容进行分析,只留下 ...

最新文章

  1. C++_泛型编程与标准库(三)
  2. 在linux中加用户,Ubuntu使用教程——在Ubuntu中添加用户
  3. 【控制】《多智能体机器人系统信息融合与协调》范波老师-第7章-基于 Markov 对策的多 Agent 协调
  4. 原来小清新色调是这样调出来的~
  5. python:实现简单的web开发demo
  6. 两种CSS3圆环进度条详解
  7. springboot + mysql + mybatis配置
  8. c#语言float转换int,C#Float表达式:将结果float转换为int时的奇怪行为
  9. iOS Runtime特性之关联对象
  10. 详解5G:关键能力、关键技术、应用场景、网络架构、经济影响
  11. 如何下载MySQL的驱动包
  12. 基于keras+VGG-16的小数据集多分类图像识别(附代码数据集)
  13. 深入解析Scheduler
  14. 鸿蒙OS到底是不是Android套皮?(少bb,看源码!)
  15. 八孔g调短洞箫_八孔G调的箫,对应的1234567应该分别按哪些孔?
  16. nginx和ftp搭建图片服务器
  17. 促进目标实现的激励技巧
  18. T4 级老专家:AIOps 在腾讯的探索和实践
  19. web服务器也是端系统么,Web服务器和游戏服务器的那些事儿
  20. 联系书商出译著的流程

热门文章

  1. 软测项目辅导综合教程
  2. TB-02 Kit开发板及TB系列BLE蓝牙模块固件及天猫精灵三元组串口烧录工具操作方法说明及固件市场介绍(基于泰凌微TLSR8258芯片)
  3. 基于决策树的交通拥堵成因分析
  4. 三步修改jupyter notebook默认路径
  5. codeforces div2 Not Assigning 题解
  6. Objective-C知识点总结
  7. 一个丰富的音乐播放封装库,支持多种音频格式,完美解决你的问题。
  8. 妹子说头像爬的太慢?升级到多线程程序爬取头像
  9. iPhone的来电铃声
  10. 树梅派烧录Lineage OS