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有如下俩种方法:

  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,暂未解决

参考

以上是关于Windows下命令行及Java+Tesseract-OCR对图像进行(字母+数字+中文)识别,亲测可行的主要内容,如果未能解决你的问题,请参考以下文章

HDFS命令行及JAVA API操作

Linux启动时显示Grub命令行及修改

展开命令行及脚本安全和set

Hive命令行及参数配置

如何使用Django 启动命令行及执行脚本

Nginx命令行及演示:重载热部署日志切割