第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > Windows下命令行及Java+Tesseract-OCR对图像进行(字母+数字+中文)识别 亲测可行

Windows下命令行及Java+Tesseract-OCR对图像进行(字母+数字+中文)识别 亲测可行

时间:2021-10-23 23:43:36

相关推荐

Windows下命令行及Java+Tesseract-OCR对图像进行(字母+数字+中文)识别 亲测可行

Windows下Java+Tesseract-OCR对图像进行字符识别,亲测可行

1. 下载tesseract-ocr、中文语言包并安装2. 命令行对图片进行识别及效果图3. Java调用Tesseart-OCR3.1 效果图3.2 源码4. 遗留问题4.1 Too many unichars in ambiguity on line 22991608,暂未解决参考

这篇博客将介绍Java如何利用Tesseract-OCR对图像进行字符识别;

1. 下载tesseract-ocr、中文语言包并安装

Tesseract-ocr是一款开源工具,可用于OCR(Optical Character Recognition)。默认识别字母+数字,识别中文需要安装相应的中文语言包)。

tesseract-ocr 3.02安装包与中文语言包chi_sim.traineddata 3.02版本-百度网盘链接:/s/1-tmDFZPvOO1GFtwJn50ahA

提取码:3siq

中文语言包chi_sim.traineddata 4.0版本在此下载

假设安装在Tesseart-OCR安装在D盘,

将语言包解压出的chi_sim.traineddata 放到 D:\Tesseract-OCR\tessdata\ 目录下

验证安装成功与否:

2. 命令行对图片进行识别及效果图

切换到安装目录及识别

cd D:\Tesseract-OCRtesseract.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 源码

<!-- /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 mons.io.FileUtils;import org.mons.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: /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,暂未解决

参考

亲测可用eng.traineddata,chi_sm.traineddata下载java+Tesseract-OCR实现图片识别java利用tesseract-OCR对图像进行字符识别tesseract-ocr java开发Java截取局部图片~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。