一款截图识别文字的OCR工具主要涉及2个环境:截图

OCR识别

前要

OCR的应用场景

根据OCR的应用场景而言,我们可以大致分成识别特定场景下的专用OCR以及识别多种场景下的通用OCR。就前者而言,证件识别以及车牌识别就是专用OCR的典型案例。针对特定场景进行设计、优化以达到最好的特定场景下的效果展示。那通用的OCR就是使用在更多、更复杂的场景下,拥有比较好的泛性。在这个过程中由于场景的不确定性,比如:图片背景极其丰富、亮度不均衡、光照不均衡、残缺遮挡、文字扭曲、字体多样等等问题,会带来极大的挑战。

OCR的技术路线

典型的OCR技术路线如下图所示:

其中OCR识别的关键路径在于文字检测和文本识别部分,这也是深度学习技术可以充分发挥功效的地方。PaddleHub为大家开源的预训练模型的网络结构是Differentiable Binarization+ CRNN,基于icdar2015数据集下进行的训练。

首先,DB是一种基于分割的文本检测算法。在各种文本检测算法中,基于分割的检测算法可以更好地处理弯曲等不规则形状文本,因此往往能取得更好的检测效果。但分割法后处理步骤中将分割结果转化为检测框的流程复杂,耗时严重。因此作者提出一个可微的二值化模块(Differentiable Binarization,简称DB),将二值化阈值加入训练中学习,可以获得更准确的检测边界,从而简化后处理流程。DB算法最终在5个数据集上达到了state-of-art的效果和性能。参考论文:Real-time Scene Text Detection with Differentiable Binarization

下图是DB算法的结构图:

接着,我们使用 CRNN(Convolutional Recurrent Neural Network)即卷积递归神经网络,是DCNN和RNN的组合,专门用于识别图像中的序列式对象。与CTC loss配合使用,进行文字识别,可以直接从文本词级或行级的标注中学习,不需要详细的字符级的标注。参考论文:An end-to-end trainable neural network for image-based sequence recognition and its application to scene text recognition

下图是CRNN的网络结构图:

截图工具

很多人会把它想的非常复杂,其实,Python中有很多可以实现截图的库或者函数,最常见的有三种方法。

一、Python调用windows API实现屏幕截图

二、使用PIL的ImageGrab模块

三、使用Selenium截图

而我们需要做到的事鼠标框选范围截图,因此我们采用PyQt5和PIL实现截图功能。

我们只需要把鼠标框选的起点和终点坐标传给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.setWindowState(self.windowState() | Qt.WindowFullScreen)

self.screen = QtGui.QScreen.grabWindow(

QtWidgets.QApplication.primaryScreen(),

QtWidgets.QApplication.desktop().winId(),

)

palette = QtGui.QPalette()

palette.setBrush(self.backgroundRole(), QtGui.QBrush(self.screen))

self.setPalette(palette)

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):

painter = QtGui.QPainter(self)

painter.setPen(Qt.NoPen)

painter.setBrush(QtGui.QColor(0, 0, 0, 100))

painter.drawRect(0, 0, self.width(), self.height())

if self.start == self.end:

return super().paintEvent(event)

painter.setPen(QtGui.QPen(QtGui.QColor(255, 255, 255), 3))

painter.setBrush(painter.background())

painter.drawRect(QtCore.QRect(self.start, self.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)

self.hide()

QtWidgets.QApplication.processEvents()

shot = self.screen.copy(QtCore.QRect(self.start, self.end))

processImage(shot)

QtWidgets.QApplication.quit()

def processImage(img):

buffer = QtCore.QBuffer()

buffer.open(QtCore.QBuffer.ReadWrite)

img.save(buffer, "PNG")

pil_img = Image.open(io.BytesIO(buffer.data()))

buffer.close()

if __name__ == '__main__':

QtCore.QCoreApplication.setAttribute(Qt.AA_DisableHighDpiScaling)

app = QtWidgets.QApplication(sys.argv)

window = QtWidgets.QMainWindow()

snipper = Snipper(window)

snipper.show()

sys.exit(app.exec_())

OCR文字识别

那么我们的文字识别模型选择了Paddle最新推出的OCR识别模型。改模型同时支持中英文识别;支持倾斜、竖排等多种方向文字识别。

识别文字算法采用CRNN (Convolutional Recurrent Neural Network)即卷积递归神经网络。其是DCNN和RNN的组合,专门用于识别图像中的序列式对象。与CTC loss配合使用,进行文字识别,可以直接从文本词级或行级的标注中学习,不需要详细的字符级的标注。该Module是一个通用的OCR模型,支持直接预测。

这一步我们就要做的是将截取的图片传入文字识别模型即可。

import os

os.environ['HUB_HOME'] = "./modules"

from PyQt5 import QtCore, QtGui, QtWidgets

from PyQt5.QtCore import Qt

from PIL import Image

import io

import sys

import numpy as np

import paddlehub as hub

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.setWindowState(self.windowState() | Qt.WindowFullScreen)

self.screen = QtGui.QScreen.grabWindow(

QtWidgets.QApplication.primaryScreen(),

QtWidgets.QApplication.desktop().winId(),

)

palette = QtGui.QPalette()

palette.setBrush(self.backgroundRole(), QtGui.QBrush(self.screen))

self.setPalette(palette)

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):

painter = QtGui.QPainter(self)

painter.setPen(Qt.NoPen)

painter.setBrush(QtGui.QColor(0, 0, 0, 100))

painter.drawRect(0, 0, self.width(), self.height())

if self.start == self.end:

return super().paintEvent(event)

painter.setPen(QtGui.QPen(QtGui.QColor(255, 255, 255), 3))

painter.setBrush(painter.background())

painter.drawRect(QtCore.QRect(self.start, self.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)

self.hide()

QtWidgets.QApplication.processEvents()

shot = self.screen.copy(QtCore.QRect(self.start, self.end))

processImage(shot)

QtWidgets.QApplication.quit()

def processImage(img):

buffer = QtCore.QBuffer()

buffer.open(QtCore.QBuffer.ReadWrite)

img.save(buffer, "PNG")

pil_img = Image.open(io.BytesIO(buffer.data()))

buffer.close()

np_images = [np.array(pil_img)]

results = ocr.recognize_text(

images=np_images, # 图片数据,ndarray.shape 为 [H, W, C],BGR格式;

use_gpu=False, # 是否使用 GPU;若使用GPU,请先设置CUDA_VISIBLE_DEVICES环境变量

output_dir='ocr_result', # 图片的保存路径,默认设为 ocr_result;

visualization=True, # 是否将识别结果保存为图片文件;

box_thresh=0.5, # 检测文本框置信度的阈值;

text_thresh=0.5) # 识别中文文本置信度的阈值;

text = []

for result in results:

data = result['data']

save_path = result['save_path']

for infomation in data:

print('text: ', infomation['text'], '\nconfidence: ', infomation['confidence'], '\ntext_box_position: ',

infomation['text_box_position'])

text.append(str(infomation['text']) + '\n')

print(text)

with open('data.txt', 'w') as f:

for i in text:

f.write(str(i))

os.system(r'data.txt')

if __name__ == '__main__':

# 加载移动端预训练模型

# ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")

# 服务端可以加载大模型,效果更好

ocr = hub.Module(name="chinese_ocr_db_crnn_server")

QtCore.QCoreApplication.setAttribute(Qt.AA_DisableHighDpiScaling)

app = QtWidgets.QApplication(sys.argv)

window = QtWidgets.QMainWindow()

snipper = Snipper(window)

snipper.show()

sys.exit(app.exec_())

那么我们可以测试一下它的效果:

那么再看一些模型的其他应用吧:

用paddleocr识别汉字_基于Paddle的截图OCR文字识别的实现相关推荐

  1. 基于Paddle的截图OCR文字识别的实现

    基于Paddle的截图&OCR文字识别的实现 一款截图识别文字的OCR工具主要涉及2个环境: 截图 OCR识别 前要 OCR的应用场景 根据OCR的应用场景而言,我们可以大致分成识别特定场景下 ...

  2. python百度云ocr文字识别软件_基于百度云的OCR识别(Python)

    2019年7月3日早上,在百度AI开发者大会上,一个来自山西的青年,将一瓶矿泉水浇在了同样来自山西的李彦宏身上. 可以回顾一下 https://b23.tv/av57665929/p1 ,着实让人一惊 ...

  3. 骨骼的动作识别数据集_基于骨骼数据的人体行为识别

    基于骨骼数据的人体行为识别 摘要 人体动作姿态识别是计算机视觉研究领域中最具挑战的研究方向,是当前的研究热点. 对人体动作姿态进行自动识别将带来一种全新的交互方式, 通过身体语言即人体的姿态和动 作来 ...

  4. python 百度ocr安装_Python基于百度AI实现OCR文字识别

    百度AI功能还是很强大的,百度AI开放平台真的是测试接口的天堂,免费接口很多,当然有量的限制,但个人使用是完全够用的,什么人脸识别.MQTT服务器.语音识别等等,应有尽有. 看看OCR识别免费的量 快 ...

  5. python人脸识别项目_基于Python与命令行人脸识别项目(系列二)

    在knowe_people文件夹中创建blur_faces_on_webcam.py文件并写入以下代码: import face_recognition import cv2 # This is a ...

  6. 汉字进行计算机识别的原理,计算机OCR文字识别技术的原理和未来发展趋势

    杨俊叶++王训伟 摘要:文章首先对OCR技术的发展背景进行了介绍,指出了OCR文字识别系统在扫描仪.文字编辑等领域的应用及优势.通过对OCR技术工作原理的介绍,重点论述了OCR文字识别系统主要的图像处 ...

  7. mac 文字识别软件ocr_mac超快速ocr文字识别软件 mac上超好用的文字识别软件推荐...

    OCR文字识别软件是在日常的生活和工作中十分常用的一款软件.而当下使用mac系统的用户也越来越多了,相比较于windows不同的是,mac上能够使用的ocr用具基本上会比较难找.这里就为大家推荐几款在 ...

  8. 中安OCR文字识别系统V5.0 ——OCR文字识别开发包SDK

    一.中安OCR文字识别系统V5.0简介 中安OCR文字识别系统V5.0是一种光学字符识别(OCR)软件开发包(OCR SDK):中安OCR文字识别系统V5.0为软件开发人员.系统集成商.数据加工商(B ...

  9. 电脑图片文字识别,得力OCR文字识别

    **电脑图片文字如何识别?**电脑图片文字识别的方法你知道吗?在生活中遇到图片文字不能编辑不能复制,需要用到图片上的文字的时候特别烦恼,要自己手动输入是多么耗时的一件事,一下子降低了工作效率,那么要怎 ...

最新文章

  1. C++ 容器 LIST VECTOR erase
  2. MySQL的insert ignore与replace into不同
  3. 和虫师一起学python(7)
  4. 967c语言程序设计是什么,2018年湖南师范大学数学与计算机科学院967C语言程序设计和数据结构[专硕]之C程序设计考研核心题库...
  5. android 全局hook_【Hook】实现无清单启动Activity
  6. Jsoup使用选择器语法来查找元素
  7. 【BZOJ1834】【codevs1362】网络扩容,最大流+费用流
  8. Adobe Acrobat reading untagged document window pops up
  9. 京东秒杀倒计时(js)
  10. usb杂谈之获取设备信息——举例鼠标urb
  11. 扫一下这个神奇的二维码,Wifi不用输密码
  12. CMS的碎片解决方案
  13. 高职对口计算机试题ppt,高职单招中职计算机练习卷和答案.doc
  14. SQL 获取年度第几周
  15. 网站关键词怎么合理布局提升网站排名
  16. Pytorch模型训练和模型验证
  17. 蓝牙卡复制html,车库蓝牙卡能复制吗
  18. 分享个梦塔防辅助工具,自动化控制刷图升级脚本
  19. 决策树 建模_主题建模到类别树中
  20. 魔王语言解释(数据结构课程设计)

热门文章

  1. openwrt STA+AP共存模式
  2. 计算机应用会考试题,余杭区2006年职高计算机应用基础会考试题
  3. python import turtle as t_turtle库的学习笔记(python)
  4. 【IT职场】阿里巴巴之马云神话
  5. 《微观经济学》 第三章
  6. Accumulation Degree
  7. kubelet cgroup driver与docker cgroup drive不一致解决方案
  8. jzoj3094. Hash函数
  9. 自考计算机英语难度,自考本科商务英语专业真的难吗
  10. 2022-05-25 网工进阶(七)OSPF-影响邻居关系建立的因素、路由撤销、路由汇总、路由过滤、Silent-Interface、报文认证