Tesseract-OCR
在图像文字识别领域,Tesseract OCR 是一款广受欢迎的开源工具,通过结合 Java 语言可以实现强大的 OCR 功能。本文将围绕 Tesseract OCR 在 Java 中的应用,以及如何解决识别准确性问题展开讨论。
优点
开源免费:代码可自由获取、修改和分发,无需支付授权费用,降低了开发成本。
多语言支持:支持多种语言的文字识别,通过下载相应的语言包,就能够对不同语言的文本进行识别。
可定制性强:调整识别参数、训练自己的字库模型,以优化在特定场景下的识别效果,如识别特定字体、字号或具有特定格式的文档。
识别准确率较高:经过不断的优化和训练,对于常规的印刷体文字,在图像质量较好的情况下,能够达到较高的识别准确率。
缺点
对图像质量要求较高:如果图像存在模糊、倾斜、噪声干扰、低分辨率等问题,可能会显著影响识别准确率。
复杂布局和特殊字体处理能力有限:复杂排版布局的文档,以及一些罕见的手写字体或艺术字体,会出现文字分割错误或识别不准确的情况。
缺乏直观的图形界面:Tesseract 主要通过命令行或编程接口来使用,对于不熟悉命令行操作或编程的用户来说,使用门槛较高。
一、安装 Tesseract OCR 引擎
1.3、Windows
从 Tesseract Home · UB-Mannheim/tesseract Wiki · GitHub下载安装程序,按照提示完成安装。
1.2、Linux
使用包管理器进行安装,例如在 Ubuntu 上可以运行 sudo apt-get install tesseract-ocr。
1.3、macOS
可以使用 Homebrew 进行安装,运行 brew install tesseract。
在 macOS 系统中,通过brew install tesseract安装 Tesseract OCR 引擎后,其默认安装路径通常是/usr/local/Cellar/tesseract。
你可以通过以下命令来确认具体路径:
brew --prefix tesseract
借助 Homebrew 安装 Tesseract 之后,tessdata目录通常位于/usr/local/share/tessdata。你可以使用以下命令来查看该目录是否存在,以及chi_sim.traineddata文件是否存在.
要是文件不存在,你需要手动下载 chi_sim.traineddata 文件。可以从 Tesseract OCR 的 GitHub 仓库下载GitHub - tesseract-ocr/tessdata: Trained models with fast variant of the "best" LSTM models + legacy models
,然后把下载好的文件放到 /usr/local/share/tessdata 目录。
二、添加 Tess4J 依赖
如果你使用 Maven 项目,可以在 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>5.11.0</version>
</dependency>
三、编写 Java 代码
public class OCRExample {
public static void main(String[] args) {
// 创建 Tesseract 实例
Tesseract tesseract = new Tesseract();
try {
// 设置 Tesseract 数据文件的路径,根据实际安装路径修改
tesseract.setDatapath("C:\\Program Files\\Tesseract-OCR\\tessdata");
// 设置识别语言,例如 "eng" 表示英文,"chi_sim" 表示简体中文
tesseract.setLanguage("eng");
// 要识别的图片文件路径,根据实际情况修改
File imageFile = new File("path/to/your/image.jpg");
// 进行 OCR 识别
String result = tesseract.doOCR(imageFile);
// 输出识别结果
System.out.println(result);
} catch (TesseractException e) {
System.err.println("OCR 识别出错: " + e.getMessage());
}
}
}
- 完善优化
基于 Tesseract OCR 的 Java 工具类,我们可以方便地在项目中实现图像格式处理和文字识别功能。在实际应用中,根据具体需求对工具类进行优化和拓展,能够更好地满足不同场景下的 OCR 需求。
4.1、图片格式转化
处理图像文件,判断格式并转换 jpg/jpeg 为 png.
/**
* 处理图像文件,判断格式并转换 jpg/jpeg 为 png
* @param inputFilePath 输入文件的路径
* @return 处理后的文件路径,如果不支持的格式则返回 null
*/
public static Map<String ,Object> processImageFile(String inputFilePath) {
Map<String, Object> resultMap = new HashMap<>();
// 图片转化后的存储位置
String outputDirectory = "/Users/admin/Downloads/WORK/JAVA/Upload/ocr";
File inputFile = new File(inputFilePath);
try {
BufferedImage image = ImageIO.read(inputFile);
String outputFileName = removeExtension(inputFile.getName()) + ".png";
File outputFile = new File(outputDirectory, outputFileName);
// 将图像写入为 PNG 格式
ImageIO.write(image, "png", outputFile);
resultMap.put("code", 0);
resultMap.put("msg", "转化成功.");
resultMap.put("url", outputFile.getAbsolutePath());
} catch (IOException e) {
resultMap.put("code", 400);
resultMap.put("msg", "转换文件格式时出错.");
}
return resultMap;
}
4.2、文件格式处理
/**
* 获取文件的扩展名
* @param fileName 文件名
* @return 文件扩展名
*/
public static String getFileExtension(String fileName) {
int lastIndex = fileName.lastIndexOf('.');
if (lastIndex == -1) {
return "";
}
return fileName.substring(lastIndex + 1);
}
/**
* 移除文件名的扩展名
* @param fileName 文件名
* @return 移除扩展名后的文件名
*/
private static String removeExtension(String fileName) {
int lastIndex = fileName.lastIndexOf('.');
if (lastIndex == -1) {
return fileName;
}
return fileName.substring(0, lastIndex);
}
/**
* 检查文件格式是否允许
* @param fileExtension 文件扩展名
* @return 如果允许则返回 true,否则返回 false
*/
public static boolean isAllowedFormat(String fileExtension) {
return "jpg".equals(fileExtension) || "jpeg".equals(fileExtension) || "png".equals(fileExtension);
}
4.3、文字转换
public static String performOCR(String resultFilePath) {
// ocr转换
Tesseract tesseract = new Tesseract();
try {
// 设置 Tesseract 数据文件的路径,根据实际安装路径修改
tesseract.setDatapath(tessDataUrl);
// 设置识别语言,例如 "eng" 表示英文,"chi_sim" 表示简体中文
tesseract.setLanguage("chi_sim+eng"); // 支持中英文混合识别
// 要识别的图片文件路径,根据实际情况修改
File imageFile = new File(resultFilePath);
// 配置 Tesseract 以提高识别准确性
tesseract.setPageSegMode(6); // 设置页面分割模式为单个统一文本块
tesseract.setOcrEngineMode(1); // 使用 LSTM OCR 引擎
// 进行 OCR 识别
String result = tesseract.doOCR(imageFile);
// 去除多余的空格和换行符
result = result.replaceAll("\\s+", " ").trim();
// 输出识别结果
return AjaxResult.Return(0, result);
} catch (TesseractException e) {
return AjaxResult.Return(400, "OCR 识别出错: " + e.getMessage());
}
}
4.4、结合业务使用
package com.cn.springboot.controller;
import com.cn.springboot.utils.AjaxResult;
import com.cn.springboot.utils.OCRUtil;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.Map;
@RestController
@RequestMapping(value={"/ocr"},method = {RequestMethod.POST,RequestMethod.GET})
public class OcrController {
@RequestMapping("/ocrUpload")
public String ocrUpload(@RequestParam("ocrFile") MultipartFile ocrFile, HttpServletRequest request) {
try {
// 检查文件是否为空
if (ocrFile.isEmpty()) {
return AjaxResult.Return(400, "上传的文件为空.");
}
// 获取上传文件的原始文件名
String originalFileName = ocrFile.getOriginalFilename();
if (originalFileName == null) {
return AjaxResult.Return(400, "无法获取上传文件的原始文件名.");
}
// 获取上传文件的扩展名
String fileExtension = OCRUtil.getFileExtension(originalFileName);
if (!OCRUtil.isAllowedFormat(fileExtension)) {
return "不支持的文件格式,仅允许上传 jpg、jpeg、png 文件";
}
// 创建临时文件
File tempFile = File.createTempFile("upload_", null);
ocrFile.transferTo(tempFile);
// 获取临时文件的绝对路径
String inputFilePath = tempFile.getAbsolutePath();
// 图片判定或转换并输出结果
Map<String, Object> map = OCRUtil.processImageFile(inputFilePath);
if (!map.get("code").toString().equals("0")) {
// 删除临时文件
tempFile.delete();
return AjaxResult.Return(400, map.get("msg").toString());
}
tempFile.delete();
// 进行 OCR 识别
return OCRUtil.performOCR(map.get("url").toString());
} catch (Exception ex) {
ex.printStackTrace();
return AjaxResult.Return(400,"请求异常:"+ex.getMessage());
}
}
}
4.5、设置语言包
TESS_DATA_URL=/usr/local/share/tessdata
五、常见问题
5.1、Error: LSTM requested, but not present!! Loading tesseract.
在使用过程中,我们还遇到了 Error: LSTM requested, but not present!! Loading tesseract. 错误。该错误是由于请求使用 LSTM 引擎,但系统中未安装或配置该引擎导致的。解决方法包括检查并更新 Tesseract 版本(确保使用支持 LSTM 的版本,如 4.0 及以上),检查并下载 LSTM 数据文件并正确配置路径,以及检查代码中对 Tesseract 引擎模式的配置是否正确。
5.2、Not a JPEG file: starts with 0x89 0x50
这个错误信息表明程序在处理文件时预期该文件是 JPEG 格式,但实际检测到的文件头并非 JPEG 格式的文件头,而是 PNG 格式的文件头。
六、总结
通过对 Tesseract OCR 在 Java 中的应用及识别准确性优化的实践,我们发现 OCR 识别准确性受到多种因素的影响,包括图像预处理、Tesseract 配置等。在实际应用中,需要根据具体情况不断调整和优化,以达到更好的识别效果。同时,对于遇到的错误要及时排查和解决,确保 OCR 功能的正常运行。
通过以上内容便可轻轻松松完成图片转文字.是不是超级简单.有任何问题欢迎留言哦!!!
重点!重点!重点!
遇到问题不用怕不如来我的知识库找找看,也许有意想不到的收获!!!
易网时代-易库资源-易库教程:.NET开发、Java开发、PHP开发、SqlServer技术、MySQL技术-开发资料大全-易网时代-易库资源-易库教程 (escdns.com)