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

  • 1. 下载tesseract-ocr、中文语言包并安装
  • 2. 命令行对图片进行识别及效果图
  • 3. Java调用Tesseart-OCR
    • 3.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版本-百度网盘链接: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有如下俩种方法:

  1. 实质上也是调用的 tesseart.exe执行的ocr识别;
  2. 调用tess4j jar包内的方法,依赖字体集(需要本地下载好字体集)
  3. 优化版本—— 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,暂未解决

参考

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

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

  1. Windows下命令行Git无法显示中文问题解决方案

    Windows下命令行Git无法显示中文问题解决方案 参考文章: (1)Windows下命令行Git无法显示中文问题解决方案 (2)https://www.cnblogs.com/burningcar ...

  2. windows下命令行方式激活venv虚拟环境

    windows下命令行方式激活venv虚拟环境 先cd venv cd Scripts activate 成功切换到venv虚拟环境下

  3. Cmder–Windows下命令行利器

    Cmder--Windows下命令行利器 目录 cmder 安装包 修改命令提示符λ为$ 添加至环境变量 多窗口 新开shell窗口 添加ll等命令 目录 cmder 安装包 修改命令提示符λ为$ 添 ...

  4. windows下命令行修改系统时间;修改系统时间的软件

    找了很久,都没有找到,还找了关键词 dos下修改系统时间 因为看到linux下修改系统时间是用hwclock 命令写入主板芯片. 而我由于某些原因想自动化修改系统时间,所以找windows下修改系统时 ...

  5. windows下命令行启动tomcat

    2019独角兽企业重金招聘Python工程师标准>>> win+R+cmd 进入命令行 进入tomcat安装目录中的bin目录,startup.bat为启动tomcat,shutdo ...

  6. Windows下命令行连接mysql及导入sql文件

    转自: https://www.cnblogs.com/CHEUNGKAMING/p/5709796.html 首先呢看连接本地的MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 ...

  7. Windows下命令行安装Pytorch(GPU)

    对于一个小白来说,找了好多博客,都是告诉你去下载cuda,cudnn,然后安装配置各种环境,十分麻烦.最近才发现了最简单的安装方法,只需要在cmd中输入简单的几行命令即可. 注意:以下命令行要在对应的 ...

  8. java调用linux进程,Java——调用Linux和Windows下命令行执行程序

    1.项目需求 需要在后端调用其他程序并且获取返回结果 2.第一个版本环境:Windows //cmdstr为命令参数 public boolean excuteCmd(String cmdstr) { ...

  9. win oracle 重启命令,Windows下命令行如何启动Oracle10g?

    .启动TNS监听 C:\Documents and Settings\Administrator>lsnrctl start LSNRCTL for 32-bit Windows: Versio ...

最新文章

  1. 【点云论文速读】最佳点云分割分析
  2. Cassandra架构、设计(集群表)和性能报告
  3. MySQL的SQL Profiler性能分析器
  4. html5 初试 indexedDB
  5. 【MySQL数据库】一天学完MySQL笔记——纯SQL文档版
  6. Angular multiple binding debug
  7. SAP CRM WebClient UI点了产品主数据搜索结果超链接后的跳转调试
  8. Windows 下有哪些逆天的软件?
  9. 二进制文件签名_二进制数的签名表示
  10. powerdesigner 生成实体代码 附加生成xml
  11. Swift NSDate的一个分类,把Mon Apr 04 19:45:37 +0800 2016这种格式的时间转换为2016-04-04 11:45:37 +0000
  12. 手机ppi排行测试软件,依然是目前屏幕色准表现最好的智能手机:iPhone XS 屏幕测试...
  13. PRCV2018美图短视频实时分类挑战赛落幕,第一名解决方案技术解读
  14. 全国医疗卫生信息化公司网址大全
  15. LINUX下PHP扩展开发:第一个C扩展
  16. 2021-09-08 网安实验-编码解码-九宫格键盘编码
  17. Promise学习:基础入门
  18. 关于K.im的满满干货!
  19. kafka搭建,演示
  20. 兔子数列 - C语言

热门文章

  1. 无人驾驶传感器融合技术
  2. 二分查找模板全面总结
  3. CentOS7的node.js安装
  4. Subscriber class xxx ,xx already registered to event
  5. android studio 开发环境搭建
  6. ecplise 工具字体大小的调整
  7. NOIP2013 华容道
  8. 为什么很多网站的验证码都设置得肉眼都很难识别?
  9. springboot-springmvc-requestParam
  10. kvm虚拟机vnc配置