OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;
现在有很多软件都支持这个功能,比如钉钉就支持扫描图片后直接转成文字。
在OCR识别领域,有一个开源的项目——Tesseract,Tesseract是一個光学字符识别引擎。Tesseract是基于Apache许可证的自由软件,自2006 年起由Google赞助开发。 2006年,Tesseract被认为是最精准的开源光学字符识别引擎之一。
但是,这个牛X的项目,现在有了Java包装的API了,那就是Tess4J (https://github.com/nguyenq/tess4j )

Tess4J是对Tesseract OCR API的Java封装。使Java能够通过调用Tess4J的API来使用Tesseract-OCR。支持的格式:TIFF,JPEG,GIF,PNG,BMP,JPEG,and PDF
准备工作
我们首先将Tess4J maven依赖项添加到我们的项目中
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.5.3</version>
</dependency>
接下来,我们需要确保Tess4j所需的本机库可以从我们的应用程序访问。Tess4J的jar文件已经附带了本机库。但是,需要在加载之前先提取它们。我们可以使用Tess4J实用工具方法来编程完成此操作:
File tmpFolder = LoadLibs.extractTessResources("win32-x86-64");
System.setProperty("java.library.path", tmpFolder.getPath());
使用LoadLibs.extractTessResources方法,我们可以将jar文件中的资源提取到本地临时目录中,注意,参数(这里是win32-x86-64)取决于所使用的系统。通过查看Tess4J jar文件,您可以看到可用的选项。我们可以通过设置Java系统属性java.library.path来指示Java从临时目录加载本机库。
接下来,我们需要为Tesseract提供语言相关的数据文件。这些数据文件包含Tesseracts LSTM OCR引擎的训练模型,可以从GitHub(https://github.com/tesseract-ocr/tessdata )下载。
检测文本
现在我们准备在Java应用程序中使用Tesseract。下面的代码片段显示了一个最简单的示例:
Tesseract tesseract = new Tesseract();
tesseract.setLanguage("deu");
tesseract.setOcrEngineMode(1);
Path dataDirectory = Paths.get(ClassLoader.getSystemResource("data").toURI());
tesseract.setDatapath(dataDirectory.toString());
BufferedImage image = ImageIO.read(Main.class.getResourceAsStream("/ocrexample.jpg"));
String result = tesseract.doOCR(image);
System.out.println(result);
首先,我们创建一个新的Tesseract实例。我们设定了我们想要识别的语言(这里是德语)。使用setOcrEngineMode(1),我们告诉Tesseract使用LSTM OCR引擎。
接下来,我们用setDatapath(..)将数据目录设置为包含下载的LSTM模型的目录(这里是resources/data)。
最后,我们从类路径加载一个示例图像,并使用doOCR(..)方法执行字符识别。结果我们得到一个包含检测到的字符的字符串。
例如,将德语维基百科OCR文章中的这张照片输入Tesseract可能会产生以下文本输出。

输出内容:
Grundsätzliches [Quelltext bearbeiten]
Texterkennung ist deshalb notwendig, weil optische Eingabegeräte (Scanner oder Digitalkameras, aber
auch Faxempfänger) als Ergebnis ausschließlich Rastergrafiken liefern können. d. h. in Zeiten und Spaten
angeordnete Punkte unterschiedlicher Färbung (Pixel). Texterkennung bezeichnet dabei die Aufgabe, die so
dargestellten Buchstaben als solche zu erkennen, dh. zu identifizieren und ihnen den Zahlenwert
zuzuordnen, der ihnen nach üblicher Textcodierung zukommt (ASCII, Unicode). Automatische Texterkennung
und OCR werden im deutschen Sprachraum oft als Synonym verwendet In technischer Hinsicht bezieht sich
OCR jedoch nur auf den Teilbereich der Muster vergleiche von separierten Bildteilen als Kandidaten zur
( Erkennung von Einzelzeichen. Diesem OCR—Prozess geht eine globale Strukturerkennung voraus, in der
zuerst Textblöcke von graphischen Elementen unterschieden, die Zeilenstrukturen erkannt und schließlich
| Einzeizeichen separiert werden. Bei der Entscheidung, welches Zeichen vorliegt, kann über weitere
\ . Algorithmen ein sprachlicher Kontext berücksichtigt werden
总结
Tesseract是一个流行的OCR开源项目。通过Tess4J,我们可以访问Java中的Tesseract API。加载本机库和下载Tesseracts LSTM数据需要进行一些设置。之后在Java中很容易执行OCR。如果您对已识别的文本不满意,那么最好看看Tesseract文档的“提高输出质量”部分(https://tesseract-ocr.github.io/tessdoc/ImproveQuality.html )。