Windows下命令行及Java+Tesseract-OCR对图像进行(字母+数字+中文)识别,亲测可行
Posted 程序媛一枚~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows下命令行及Java+Tesseract-OCR对图像进行(字母+数字+中文)识别,亲测可行相关的知识,希望对你有一定的参考价值。
Windows下Java+Tesseract-OCR对图像进行字符识别,亲测可行
这篇博客将介绍Java如何利用Tesseract-OCR对图像进行字符识别;
1. 下载tesseract-ocr、中文语言包并安装
Tesseract-ocr是一款开源工具,可用于OCR(Optical Character Recognition)。默认识别字母+数字,识别中文需要安装相应的中文语言包)。
tesseract-ocr 3.02安装包与中文语言包chi_sim.traineddata 3.02版本-百度网盘链接:https://pan.baidu.com/s/1-tmDFZPvOO1GFtwJn50ahA
提取码:3siq
中文语言包chi_sim.traineddata 4.0版本在此下载
假设安装在Tesseart-OCR安装在D盘,
将语言包解压出的chi_sim.traineddata 放到 D:\\Tesseract-OCR\\tessdata\\ 目录下
验证安装成功与否:
2. 命令行对图片进行识别及效果图
切换到安装目录及识别
cd D:\\Tesseract-OCR
tesseract.exe E:\\mat\\mvt\\java-ocr-demo\\ocr\\opencv_logo.jpg opencv_logo
默认识别(字母+数字),识别中文需要安装中文语言包,并指定模型 -l chi_sim
tesseract 2.jpg 2 -l chi_sim -psm 7
- 参数1:2.jpg 图片全路径
- 参数2:2 识别文本输出文字名,结果将写入2.txt
- 参数3:指定语言包,-l chi_sim表示用简体中文字库,默认eng(识别字母+数字)
- 参数4:-psm 7 表示告诉tesseract 2.jpg图片只有一行文本,从而可以减少识别错误率,默认为3。
字母成功识别效果图如下:
图过大,字符太小可能无法识别,需要将图片截取下保证图片中字符清晰可见即可正确识别出来;
数字成功识别效果图如下:
中文+字母识别:可以看到文字并没有正确识别;不是特别准确
中文+字母+数字识别,中文不太准确,效果图如下:
3. Java调用Tesseart-OCR
Java调用Tessert-OCR有如下俩种方法:
- 实质上也是调用的 tesseart.exe执行的ocr识别;
- 调用tess4j jar包内的方法,依赖字体集(需要本地下载好字体集)
- 优化版本—— Java-基于百度API的图片文字识别(支持中文,英文和中英文混合)
3.1 效果图
调用本地exe方式效果图如下:英文比较准确,中文的效果不太好
调用jar加载 eng 模型来识别 效果图如下:多张图片测试,字母+数字的效果要好一些,基本都识别出来,中文识别均乱码;
调用jar加载中文的 chi_sim 模型来识别 效果图如下:多张图片测试,字符字母部分未成功识别,也有识别错的,中文识别效果也不好;
3.2 源码
<!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j -->
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>3.2.1</version>
</dependency>
package com;
import lombok.extern.slf4j.Slf4j;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.apache.commons.io.FileUtils;
import org.junit.platform.commons.util.StringUtils;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
/*************************************
*Class Name: TessertOcr
*Description: <java调用tessert-ocr识别>
*@author: seminar
*@create: 2021/7/8
*@since 1.0.0
*************************************/
public class TessertOcr {
/**
* 调用tesseart.exe进行OCR识别
*
* @param exePath exe绝对路径
* @param jpgPath jpg路径
* @param flag 默认false,使用eng只支持字母+数字, True:支持中文+字母+数字
* @return
*/
public static String callTesseartExe(String exePath, String jpgPath, boolean flag) {
String res = "";
try {
Process process = null;
if (!flag) {
process = Runtime.getRuntime().exec(new String[]{exePath, jpgPath, jpgPath.replaceAll(".jpg", "")});
} else {
process = Runtime.getRuntime().exec(new String[]{exePath, jpgPath, jpgPath.replaceAll(".jpg", ""), "-l", "chi_sim"});
}
StringBuilder processOutput = new StringBuilder();
try (BufferedReader processOutputReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));) {
String readLine;
while ((readLine = processOutputReader.readLine()) != null) {
processOutput.append(readLine + System.lineSeparator());
}
// 等待执行完成
process.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (process != null) {
process.destroy();
}
}
res = processOutput.toString().trim();
res = FileUtils.readFileToString(new File(jpgPath.replaceAll(".jpg", ".txt")));
} catch (IOException e) {
e.printStackTrace();
}
return res;
}
public static void main(String[] args) {
// 第一种方法
String exePath = "D:/Tesseract-OCR/tesseract.exe";
String jpgPath = "E:\\\\mat\\\\mvt\\\\java-ocr-demo\\\\images\\\\1622175322109_0.025711_cc.jpg";
System.out.println("1622175322109_0.025711_cc.jpg callTesseartExe: " + callTesseartExe(exePath, jpgPath, false));
System.out.println("chinese.jpg callTesseartExe: " + callTesseartExe(exePath,
"E:\\\\mat\\\\mvt\\\\java-ocr-demo\\\\images\\\\chinese.jpg", true));
String fileDir = "E:\\\\mat\\\\mvt\\\\java-ocr-demo\\\\images\\\\";
File[] list = new File(fileDir).listFiles();
ITesseract instance = new Tesseract();
instance.setDatapath("E:\\\\mat\\\\mvt\\\\java-ocr-demo\\\\src\\\\test\\\\java\\\\com\\\\tessdata");
// 默认识别英文(字母+英文),如果识别中文(数字+中文)需要设置语言包
// instance.setLanguage("chi_sim");
for (File file : list) {
if (file.getName().endsWith(".jpg")) {
try {
String result = instance.doOCR(file);
if (StringUtils.isNotBlank(result)) {
result = result.replaceAll("\\n", "");
result = result.replaceAll(" ", "");
if (result.length() > 30) {
System.out.println(file.getName() + ": " + result.substring(result.length() - 30, result.length()));
} else {
System.out.println(file.getName() + ": " + result);
}
} else {
System.out.println(file.getName() + ": ");
}
} catch (TesseractException e) {
e.printStackTrace();
}
}
}
}
}
4. 遗留问题
4.1 Too many unichars in ambiguity on line 22991608,暂未解决
参考
以上是关于Windows下命令行及Java+Tesseract-OCR对图像进行(字母+数字+中文)识别,亲测可行的主要内容,如果未能解决你的问题,请参考以下文章