APP下载

基于Tesseract的屏幕文字识别软件设计与实现

2020-11-30张敬业郭亮张云峰

科学与信息化 2020年30期
关键词:软件设计

张敬业 郭亮 张云峰

摘 要 目前各类文字识别软件并不匮乏,但普遍需要以图片文件形式作为输入,或者仅支持软件内部视图中的内容获取与识别,难以在系统层面对屏幕显示的任意内容进行截取和文字识别。基于Tesseract识别引擎,设计实现了一种轻量化的屏幕文字识别软件,能够实现利用鼠标对屏幕任意矩形区域划定内容的文字识别,从屏幕截取、文字识别,到识别结果展示实现了无缝的自动化衔接。基于Tesseract优秀的文字识别率和快捷的屏幕内容点划截取功能,有效提升了文字识别软件使用的效率和便利程度。

关键词 Tesseract;屏幕文字识别软件;软件设计

目前各类文字识别软件并不匮乏,但大部分需要以图片文件或文档文件的方式向软件提供输入,经由软件识别后给出识别结果。这种方式比较适合于已有大量待识别文件的情况下进行批量识别。但另一种常见的文字识别使用场景是待识别的内容是随着使用者的某些动作逐步呈现的,例如使用者在网络搜索和资料阅读的过程中不断发现需要进行文字识别的内容[1]。在这种情况下,使用者更希望以灵活高效的方式对所需识别的内容进行截取和自动化识别。利用鼠标点划的方式截取屏幕任意矩形区域进行自动化识别是一种便捷的方式,但目前能够实现这一功能的轻量级文字识别软件还不多,部分软件能够在其软件内部视图中进行内容获取与识别,但无法在系统层面实现对屏幕显示的任意内容进行截取和文字识别。本文基于Tesseract识别引擎设计实现了一种轻量化的屏幕文字识别软件,能够实现利用鼠标对屏幕任意矩形区域划定内容的文字识别,从屏幕截取、文字识别,到识别结果展示实现了无缝的自动化衔接。该软件将Tesseract引擎优秀的文字识别率和快捷的屏幕内容点划截取识别功能相结合,有效提升了文字识别软件使用的效率和便利程度。

1基于Tesseract的屏幕文字识别软件的设计

本文中屏幕文字识别软件主要基于Tesseract识别引擎和Java Swing GUI技术进行设计构建,以下首先对Tesseract识别引擎和Java Swing进行简要介绍,然后对软件具体设计进行描述。

1.1 Tesseract引擎

Tesseract引擎最初在1985年由惠普实验室作为专有软件开发,之后于2005年作为开源软件发布。其可以运行于Linux,Windows和Mac OSX系统上。就字符识别精度而言,Tesseract在20世纪90年代即被认为位居光学字符识别(Optical Character Recognition,OCR)引擎的前三名。目前Tesseract引擎的最新版本V4中增加了基于长短期记忆(Long Short-Term Memory,LSTM)时间循环神经网络的识别模型,进一步提高了文字识别率,并且其所支持识别的语言也达到了116种。

1.2 Java Swing

Java是目前应用最为广泛的计算机编程语言之一,Swing是Java的图形用户界面(Graphical User Interface,GUI)工具包,其提供了丰富的GUI开发功能。选择Java Swing与Tesseract引擎相结合进行屏幕文字识别软件的开发具有较为明显的优势,一方面Java Swing历经长时间的实践应用,具有成熟稳定,功能完善的特点[2];另一方面,由于Swing使用纯Java实现,所以同Java本身一样具备跨平台能力,其与Tesseract相配合,能够充分发挥Tesseract引擎自身已具备的多平台运行能力。

1.3 软件设计

基于Tesseract引擎和Java Swing工具包,本文设计的屏幕文字识别软件模块构成与基本工作流程如图1所示。

软件主要包含屏幕截取模块、文字识别模块和结果显示模块。首先由屏幕截取模块对当前屏幕显示内容进行完整截图,得到的图片被静态置于系统顶层显示,避免被其他应用遮擋。然后屏幕截取模块会记录使用者在屏幕完整图片上进行点划框选的起止点坐标,并利用该坐标对完整图片进行裁剪获得子图。子图被送入文字识别模块经Tesseract引擎分析后得到识别结果字符串。然后该字符串被送至结果显示模块,将被自动展示给使用者。

2软件的功能实现

2.1 屏幕任意矩形范围内容截取的实现

屏幕任意矩形范围内容的截取主要通过两个步骤来具体实现,一是将当前时刻的完整屏幕显示内容进行获取和缓存;二是将缓存的完整屏幕图片进行置顶显示,然后记录使用者鼠标点划动作框定范围的坐标,再按坐标值提取完整图片的子图片。

当前时刻的完整屏幕显示内容主要利用java.awt.Robot中的createScreenCapture(Rectangle screenRect)方法来实现,其中screenRect参数可以指定为new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()),即获取整个屏幕内容。获取完整屏幕图片后,将其静态显示于屏幕最顶层,以防被其他应用遮挡。

然后通过记录使用者鼠标点划动作的起止点来确定其选取的图片具体范围。通过addMouseMotionListener(MouseMotionListener l)方法来添加一个鼠标监听器,并需要重写监听器中的mouseDragged(MouseEvent evn)方法利用evn.getX()和evn.getY()来提取鼠标拖动前后的坐标点位置。获得具体坐标位置后用BufferedImage类的getSubimage(int x, int y, int w, int h)即可得到使用者选定区域的子图片。

2.2 基于Tesseract的文字识别功能实现

Java应用程序调用Tesseract引擎实现文字识别功能比较便利的方式是通过Tesseract的Java Native Access包装器Tess4j来实现,需要先将Tess4j的jar文件添加到项目中。

在需要进行文字识别时,首先创建ITesseract类的对象instance,然后利用其setDatapath?(String datapath)方法设定识别训练文件所在的目录位置,利用其setLanguage?(String language)设置要进行识别的语言语种。在Tesseract项目主页可以下载其支持的116种语言的训练文件。最后,执行instance.doOCR(BufferedImage bi)即可得到识别结果字符串。

2.3 识别结果输出的实现

识别结果输出最简单的方式是将其写入一个文本文件,然后使用者自行打开该文本文件根据需要进行进一步处理,但这种方式的自动化程度不高,使用者找到并打开识别结果文件较为费时。在本文软件中识别结果输出的实现方式是将其放入javax.swing.JTextPane中,当识别完成后自动弹出一个包含该JTextPane的对话框,将识别结果直接呈现给使用者[3]。

需要注意的是,由于Tesseract支持多达116种语言的识别,对于一些复杂文字识别结果在JTextPane上的正常显示,可能需要利用Java的字体载入功能对相关的外部字体进行预先加载。

3结束语

本文设计的屏幕文字识别软件将Tesseract引擎优秀的文字识别率和便捷的系统级屏幕内容点划截取功能相结合,实现了从屏幕任意内容截取、文字识别,到识别结果展示的无缝自动化衔接,有效提升了文字识别软件的使用效率和便利程度,也为今后开发设计相关文字识别软件提供了参考。

参考文献

[1] 赵满来.Java语言GUI程序设计[M].北京:清华大学出版社,2018: 167-175.

[2] Tesseract Open Source OCR Engine[EB/OL].https://github.com/tesseract-ocr/tesseract,2020-08-25.

[3] Tess4J Project[EB/OL].http://tess4j.sourceforge.net/,2020-08-25.

猜你喜欢

软件设计
CAN总线通信技术在电梯监控系统中的应用
基于单片机SPCE061A的字幕机点阵式字母电子显示屏的设计制作
电力参数监测系统研究
基于STM8S903K3的序列打螺丝夹具的软件设计
一种VHDL语言代码重用的方法
系统工程方法在计算机软件设计中的应用分析
基于Java语言的手机软件开发技术分析
计算机软件可维护性路径研究
智能温室控制系统的研究与开发