`
zhouxianglh
  • 浏览: 268132 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java使用Tess4J 进行图片文字识别 笔记

    博客分类:
  • J2SE
 
阅读更多
最近的工作中需要使用到从图片中识别文字的操作,就在网上找到到Tess4j.那么,现在来总结一下使用中遇到的问题.
关于Tess4J简价:
http://tess4j.sourceforge.net/ (你懂的)
很简洁的项目主页.一个从Java角度使用JNA封闭的针对 Tesseract ORC 的开源项目,使用  Apache License, v2.0 协议.支持TIFF, JPEG, GIF, PNG, and BMP image formats,Multi-page TIFF images,PDF document format.(支持Tiff是一个很大的亮点)
 
那就再了解一下   Tesseract ORC.
https://code.google.com/p/tesseract-ocr/  是一个Google支持的开源的OCR图文识别开源项目.去持多语言(当前3.02 版本支持包括英文,简体中文,繁体中文),支持Windows,Linux,Mac OSX 多平台.使用中Tesseract 的识别率非常高. ( 自己仅对数字,使用中图片清析的情况下没发生错误 )
 
网上传的代码示例大多是在Windows下安装Tesseract ORC后通过CMD命令操作进行图识别操作.而 Tess4j 针对Tesseract 提供了JNI支持,同时还提供了一些图片操作的工具类,提供比如图片放大,旋转,黑白处理,锐化 等用来提高识别率的操作.操作十分方便. Tess4j 简单到超乎想象,只是自己在使用环境比较特殊,遇到很多问题,这里一一道来.
 
1 依赖包.
tess4j.jar   Tess4j的本尊,用于Tesseract 的JNA支持,并提供相关操作工具类
jna.jar       看到Tesseract 的第一反应是要用cmd或JNI来操作它,了解了一下 Tess4j 使用的JNA,有点JNI高级版的感觉,CMD什么的,玩蛋蛋去吧.
jai_imageio.jar   图片操作的工具类,支持Tiff就靠它了. 它的 META-INF 里有文章,这个后面详说.
还有其它几个包,是用于操作PDF用的吧,没有引用,也没有发生错误.所以的包可以在 Tess4j 的文件目录里面找到.
 
2 操作代码.
官方的示例中给出了一个超级简单有效的示例,不足20行代码!!!我和小伙伴们都被震惊了!!!关键代码如下:
File imageFile = new File("eurotext.tif");
Tesseract instance = Tesseract.getInstance();  // JNA Interface Mapping
String result = instance.doOCR(imageFile);
实际使用中为了提高识别率还要对图片作一些处理来提高识别率,使用Tess4j 自带的工具类即可完成,这样识别率就大大的提高了.( 这里无法解决 验证码 中干扰线问题,干扰线的清理,网上有其它方式处理 )
// 这里对图片黑白处理,增强识别率.这里先通过截图,截取图片中需要识别的部分
BufferedImage textImage = ImageHelper.convertImageToGrayscale(ImageHelper.getSubImage(panel.image, startX, startY, endX, endY));
// 图片锐化,自己使用中影响识别率的主要因素是针式打印机字迹不连贯,所以锐化反而降低识别率
// textImage = ImageHelper.convertImageToBinary(textImage);
// 图片放大5倍,增强识别率(很多图片本身无法识别,放大5倍时就可以轻易识,但是考滤到客户电脑配置低,针式打印机打印不连贯的问题,这里就放大5倍)
textImage = ImageHelper.getScaledInstance(textImage, endX * 5, endY * 5);
3 使用中遇到的问题
3.1 相关DLL文件,相关字库文件
liblept168.dll,libtesseract302.dll 其中 liblept168.dll 要先加载.
tessdata 存放的是字库文件,如果需要数字,英文以外的支持需要 Tesseract 页面下载相关字库.
因为公司使用时是将文件打成Jar布署,然后提供客户端下载,所以就把以上两个文件一起打进tess4j.jar里面,然后客户端使用时 tessdata 直接可用,而 liblept168.dll,libtesseract302.dll 需要释放到临时目录然后加载.相关代码:
loadDLL("liblept168.dll");//注意加载先后顺序
loadDLL("libtesseract302.dll");//注意加载先后顺序
private static void loadDLL(String libFullName) {
        try {
            String nativeTempDir = System.getProperty("java.io.tmpdir");
            InputStream in = null;
            FileOutputStream writer = null;
            BufferedInputStream reader = null;
            File extractedLibFile = new File(nativeTempDir + File.separator + libFullName);
            if (!extractedLibFile.exists()) {
                try {
                    in = Tesseract.class.getResourceAsStream("/" + libFullName);
                    Tesseract.class.getResource(libFullName);
                    reader = new BufferedInputStream(in);
                    writer = new FileOutputStream(extractedLibFile);
                    byte[] buffer = new byte[1024];
                    while (reader.read(buffer) > 0) {
                        writer.write(buffer);
                        buffer = new byte[1024];
                    }
                    in.close();
                    writer.close();
                    System.load(extractedLibFile.toString());
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (in != null) {
                        in.close();
                    }
                    if (writer != null) {
                        writer.close();
                    }
                }
            } else {
                System.load(extractedLibFile.toString());
            }
        } catch (IOException e) {
            logger.error("初始化 " + libFullName + " DLL错误", e);
        }
 }
3.2 相关异常
错误信息:null
错误详细堆栈信息:java.util.NoSuchElementException: null
at: javax.imageio.spi.FilterIterator.next(ServiceRegistry.java:808)
这个错误在开发环境下没有报错,但是在使用环境下出错,网上说出错原因是因为  jai_imageio.jar 丢失.
如果在操作中遇到错误,很可能是这个原因,但是在前面的代码的工具类里使用了  jai_imageio.jar ,如果报错,可能会报某类找不到的错误
自己这里显然不是.查看JDK中关于报错位置的代码,大概问题是因为注册的类没找到的原因.根据JDK文档的说明在 jai_imageio.jar 的 META-INF 的 service 包里面找到了相关的注册代码.分析了下,可能是因为金蝶EAS客户端使用自定义的类文件加载器,导至 META-INF 中的注册信息未能读取.这里手动注册一下.代码如下:
        // FUCK,客户端加载jar的方式很特殊,所以第三方包注册的serve 无法生效,这里就行动注册了,事儿真多
        IIORegistry registry = IIORegistry.getDefaultInstance();
        // registry.registerServiceProvider(new ImageReadWriteSpi(), OperationRegistrySpi.class);//这个,注册不了
        registry.registerServiceProvider(new ChannelImageInputStreamSpi(), ImageInputStreamSpi.class);
        registry.registerServiceProvider(new ChannelImageOutputStreamSpi(), ImageOutputStreamSpi.class);
        // ---------
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReaderSpi(), ImageReaderSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.png.CLibPNGImageReaderSpi(), ImageReaderSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReaderSpi(), ImageReaderSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReaderCodecLibSpi(), ImageReaderSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.wbmp.WBMPImageReaderSpi(), ImageReaderSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.bmp.BMPImageReaderSpi(), ImageReaderSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.pnm.PNMImageReaderSpi(), ImageReaderSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.raw.RawImageReaderSpi(), ImageReaderSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.tiff.TIFFImageReaderSpi(), ImageReaderSpi.class);
        //
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageWriterSpi(), ImageWriterSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageWriterSpi(), ImageWriterSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.png.CLibPNGImageWriterSpi(), ImageWriterSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageWriterSpi(), ImageWriterSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageWriterCodecLibSpi(), ImageWriterSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.wbmp.WBMPImageWriterSpi(), ImageWriterSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.bmp.BMPImageWriterSpi(), ImageWriterSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.gif.GIFImageWriterSpi(), ImageWriterSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.pnm.PNMImageWriterSpi(), ImageWriterSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.raw.RawImageWriterSpi(), ImageWriterSpi.class);
        registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.tiff.TIFFImageWriterSpi(), ImageWriterSpi.class);
世界终于安静了.....
分享到:
评论
3 楼 zhaoaifeiyu 2017-07-19  
楼主真是幽默,不过我看这个帖子居然是13年的。。。  我感觉我实在是太low了,居然现在才想到用这东西
2 楼 wangzihui 2015-11-27  
你好,能给我一个完整的代码么?我按照你的写出来后,汉字全是乱码,能识别的很少
1 楼 piaolin7 2015-06-13  
[color=orange]                                                           [/col
[flash=200,200][flash=200,200][url][url][img][list]
[*][list]
[*][*]
引用
引用
[u][i][i][i][i][b][b][b][b][b][b][b][b][b][b][b][i] :cry: [/i][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/i][/i][/i][/i][/u]
  • [/list]
  • [/list][/img][/url][/url][/flash][/flash]
    |
    or]

    相关推荐

      Tess4j3.4.8图片文字识别

      使用Tess4J进行图片文字识别,首要步骤是安装和配置必要的组件。这包括下载Tess4J库(如Tess4J-3.4.8-src压缩包),以及对应的Tesseract OCR引擎。在Java项目中,你需要将Tess4J的jar文件添加到类路径中,同时确保...

      基于Tess4J的OCR文字识别demo

      3. 使用Tess4J的API进行OCR识别,将识别出的文字显示在界面上或保存到文件中。 4. 可能还包含了错误检查和修正功能,以及识别结果的导出选项。 **应用场景** Tess4J和OCR技术广泛应用于各种场景,如: - **文档...

      Java_Tess4j下载

      Java_Tess4j下载主要涉及的是在Java环境中利用Tess4J库进行图像中的中文文字识别。Tess4J是一个Java绑定的Tesseract OCR(Optical Character Recognition,光学字符识别)引擎,它允许开发者在Java应用程序中实现...

      java识别图片文字英文、中文 tess4j

      Java识别图片中的文字,英文和中文,主要依赖于Tess4J库,这是一个基于Java的接口,用于调用Google的开源OCR(光学字符识别)引擎Tesseract。在本文中,我们将深入探讨如何利用Tess4J来实现这个功能,以及在实际应用...

      Java调用tess4j完成 OCR 文字识别

      在Java中使用tess4j进行OCR文字识别,首先需要确保已经正确安装了Tesseract OCR。这通常包括下载并安装Tesseract的可执行文件,以及安装必要的语言数据包,以便支持不同语言的识别。安装完成后,将其添加到系统的...

      tess4j 图片 文字

      Tess4J通过提供简洁的API接口,使得开发人员能够方便地在Java应用程序中实现文字识别功能。 Tesseract OCR引擎由Google维护,最初由HP开发,是一个开源项目,具有高度可定制性和灵活性。Tess4J作为其Java绑定,为...

      ocr tess4j java demo识别图片技术

      在这个Java_OCR的压缩包文件中,我们很可能是找到了一个使用Tess4J进行OCR识别的示例项目。下面我们将详细探讨这个领域的相关知识点。 首先,我们要了解Tess4J的基本用法。在Java项目中,我们需要添加Tess4J的依赖...

      tess4j语言识别库

      tess4j作为其Java版本,为开发者提供了在Java平台上进行文本识别的能力,使得开发者可以轻松地在Java应用中集成OCR功能,从而实现从图像中自动提取文本的目的。 在Windows环境下,tess4j的使用相对简单。首先,需要...

      Java Tess4J 实现OCR 可运行Demo

      Java Tess4J 是一个用于Java平台的开源库,它...这个Demo会展示一个完整的使用Java Tess4J进行OCR识别的流程,帮助开发者快速上手并理解其工作原理。通过对源码的分析和实践,你可以更好地掌握Tess4J和OCR技术的运用。

      Java 识别 Tess4J Demo

      Java Tess4J 实现OCR 可运行Demo 一 下载相关的jar包 1.下载Tess4J jar,网址:http://sourceforge.net/projects/tess4j/ 2.如果你使用的JVM 64位的,还需要下载 liblept168.dll、libtesseract302.dll的64位文件

      tess4j实现图片识别demo

      本示例将介绍如何使用Tess4J来实现PDF中的图片识别。 首先,我们需要了解Tesseract OCR。Tesseract是一个开源的OCR引擎,由Google维护,它能够识别多种语言的文本,并且具有较高的准确率。Tess4J是Tesseract的Java...

      Tess4j+中文识别+使用介绍文档

      Tess4j+中文识别+使用介绍文档..下载后 是一个Java工程,使用的开发工具为IDEA,Eclips开发者可将src目录下Java 文件进行拷贝即可,lib依赖相应导入,点击已实现功能的Main.java 类直接运行即可实现图片中文字识别 ....

      tess4j(图像识别)java微服务linux运行所需库文件

      tess4j微服务或maven项目的jar包自带window的动态链接库文件,但是不适配linux,需要自行编译创建,使用版本tesseract-4.1.1.tar.gz、leptonica-1.74.4,编译比较耗时繁琐,以来的库比较多,使用直接将解压后的文件...

      tess4J中文库.rar

      首先,要使用tess4J进行中文识别,你需要下载并安装Tesseract OCR引擎。这个引擎包含了各种语言的训练数据,其中"chi_sim.traineddata"就是用于识别简体中文的训练数据。在运行tess4J之前,确保将这个文件放置在...

      JAVA-Tess4J简单的图像识别DEMO

      【JAVA-Tess4J简单的图像识别DEMO】是一个基于Java的项目,利用Tesseract OCR(Optical Character Recognition,光学字符识别)库进行图像中的文字识别。Tesseract是一个开源的OCR引擎,最初由HP开发,后来由Google...

      简单tess4j-3.4.4OCR图片转文字包含详细IDEA部署文档

      tess4j作为Tesseract的Java接口,使得开发者能够方便地在Java项目中集成OCR功能。 **tess4j-3.4.4版本** tess4j-3.4.4是该库的一个特定版本,发布于较早的时间。尽管可能有一些更新版本提供更多的功能和改进,但这...

      centos7部署tesseract并实现java+tess4j进行图片识别

      ### CentOS 7 部署 Tesseract OCR 并结合 Java 和 Tess4J 实现图片识别 #### 一、概述 Tesseract 是一个开源的光学字符识别(Optical Character Recognition, OCR)引擎,由 Google 主导维护。它可以识别多种格式...

      tess4j例子

      **Tess4J** 是一个Java库,它为开发者提供了与OCR(Optical Character Recognition,光学字符识别)软件Tesseract进行交互的能力。Tesseract是一个开源的OCR引擎,最初由HP开发,后来被Google维护,现在是世界上最...

      Java图片内容识别支持tess4j5.8

      tess4j-5.8.0截至2023.08.21最新版本,Java图片识别支持,对Tesseract-ocr的java版本封装,可进行图片内容识别; 1、在未训练的情况下,中文识别率极低(中文训练包需要单独下载),英文识别率也不高,例如:l、1不分...

      tess4J数字库.rar

      【tess4J数字库.rar】是一个包含OCR(光学字符识别)功能的资源包,主要应用于识别图片中的数字、金额以及英文字符。OCR技术是一种自动将图像中的字符转换为可编辑文本的技术,对于处理纸质文档数字化、表格识别、...

    Global site tag (gtag.js) - Google Analytics