java 怎么调用tess4j

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 怎么调用tess4j相关的知识,希望对你有一定的参考价值。

  网上传的代码示例大多是在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行代码!!!我和小伙伴们都被震惊了!!!关键代码如下:

  Java代码  收藏代码

  File imageFile = new File("eurotext.tif");

  Tesseract instance = Tesseract.getInstance();  // JNA Interface Mapping

  String result = instance.doOCR(imageFile);

  实际使用中为了提高识别率还要对图片作一些处理来提高识别率,使用Tess4j 自带的工具类即可完成,这样识别率就大大的提高了.( 这里无法解决 验证码 中干扰线问题,干扰线的清理,网上有其它方式处理 )

  Java代码  收藏代码

  // 这里对图片黑白处理,增强识别率.这里先通过截图,截取图片中需要识别的部分

  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 需要释放到临时目录然后加载.相关代码:

参考技术A

java 调用tess4j步骤如下:

一 下载相关的jar包

1.下载Tess4J jar,网址:http://sourceforge.net/projects/tess4j/

2.如果你使用的JVM 64位的,还需要下载 liblept168.dll、libtesseract302.dll的64位文件,下载地址:https://github.com/charlesw/tesseract/tree/master/src/lib/TesseractOcr/x64


二 项目整合

先看看最后整合成功的目录结构,开发环境:Win8.1 64位 + Eclipse 4.2 + JDK 7 64位,工程目录结构如下:


       src目录下是 Tess4J的源码目录,test目录 是Tess4J官方提供的demo目录,并将 liblept168.dll、libtesseract302.dll,gsdll64.dll(pdf转换需要用到此文件) 三个文件拷贝到 src根目录下。


三 测试代码

/**
    * Test of doOCR method, of class Tesseract1.
    */
   @Test
   public void testDoOCR_File() throws Exception
       System.out.println("doOCR on a PNG image");
       File imageFile = new File("eurotext.png");
       String expResult = "The (quick) [brown] fox jumps!\\nOver the $43,456.78 <lazy> #90 dog";
       String result = instance.doOCR(imageFile);
       System.out.println(result);
       assertEquals(expResult, result.substring(0, expResult.length()));
   

参考技术B 你说的是tom4j吧?

Java调用wsdl,怎么实现

java调用wsdl的步骤如下,主要是使用第三方框架:

步骤如下:

1.下载AXIS2类库,AXIS2是目前java调用webservice的一个主要方法(由于更新较频繁,请自行google该类库的网址)

2.由于是第三方webservice,直接引入AXIS2的包就可以用了,代码如下: 

import java.rmi.RemoteException;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
 
public class webServiceTest 
    public String invokeRemoteFuc() 
        String endpoint = "http://localhost:8080/webservice/services/helloworld";
        String result = "no result!";
        Service service = new Service();
        Call call;
        Object[] object = new Object[1];
        object[0] = "Dear I miss you";//Object是用来存储方法的参数
        try 
            call = (Call) service.createCall();
            call.setTargetEndpointAddress(endpoint);// 远程调用路径
            call.setOperationName("say");// 调用的方法名
 
            // 设置参数名:
            call.addParameter("str1", // 参数名
                    XMLType.XSD_STRING,// 参数类型:String
                    ParameterMode.IN);// 参数模式:\'IN\' or \'OUT\'
 
            // 设置返回值类型:
            call.setReturnType(XMLType.XSD_STRING);// 返回值类型:String         
 
            result = (String) call.invoke(object);// 远程调用
         catch (ServiceException e) 
            e.printStackTrace();
         catch (RemoteException e) 
            e.printStackTrace();
        
        return result;
    
 
    public static void main(String[] args) 
        webServiceTest t = new webServiceTest();
        String result = t.invokeRemoteFuc();
        System.out.println(result);
    

该方法的原理很简单,通过AXIS2封装好的类设置URL和参数,直接调用就好了,我们要关注的就是设置URL,方法,还有方法的参数,其他的copy&paste好啦,很简单吧,再看看其他的方法,我勒个去了,害我瞎搞两天。迟点上个源码共大家参考!

参考技术A 步骤如下:

1.下载AXIS2类库,AXIS2是目前java调用webservice的一个主要方法(由于更新较频繁,请自行google该类库的网址)

2.由于是第三方webservice,直接引入AXIS2的包就可以
代码如下:

import java.rmi.RemoteException;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;

public class webServiceTest
public String invokeRemoteFuc()
String endpoint = "http://localhost:8080/webservice/services/helloworld";
String result = "no result!";
Service service = new Service();//新建一个service
Call call;
Object[] object = new Object[1];
object[0] = "Dear I miss you";//Object是用来存储方法的参数
try
call = (Call) service.createCall();
call.setTargetEndpointAddress(endpoint);// 远程调用路径
call.setOperationName("say");// 调用的方法名

// 设置参数名:
call.addParameter("str1", // 参数名
XMLType.XSD_STRING,// 参数类型:String
ParameterMode.IN);// 参数模式:'IN' or 'OUT'

// 设置返回值类型:
call.setReturnType(XMLType.XSD_STRING);// 返回值类型:String

result = (String) call.invoke(object);// 远程调用
catch (ServiceException e)
e.printStackTrace();
catch (RemoteException e)
e.printStackTrace();

return result;//返回值


public static void main(String[] args)
webServiceTest t = new webServiceTest();

String result = t.invokeRemoteFuc();
System.out.println(result); //输出




通过AXIS2封装好的类设置URL和参数,直接调用。
参考技术B 导入axis的八个包:
axis.jar
commons-discovery.jar
commons-logging.jar
jaxrpc.jar
saaj.jar
wsdl4j.jar
axis-ant.jar
log4j-1.2.8.jar

开发客户端程序。开发客户端程序的项目中要加入axis.jar包。
文件:TestWebService.java
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
public class TestWebService
public static void main(String[] args)
try
//还记得刚才的那个WebService的services.xml中的namespace吗?
String endpoint = "http://localhost:8080/uum/services/Hello.jws?wsdl";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName("GetName"); // 这里是的Hello类中的方法名(注意大小写)
call.setReturnType(XMLType.XSD_STRING); // 返回值类型。
call.addParameter("name",org.apache.axis.encoding.XMLType.XSD_STRING,javax.xml.rpc.ParameterMode.IN);
String[] str= "张三";
Object[] o = str;
//Object[] o =null;//如果你的方法中没有参数,那么就这样写吧。
String hello = (String) call.invoke(o);// 做方法执行。
System.out.println(hello);
catch (Exception e)
System.err.println(e.toString());



执行这段代码,将会在命令行中输出 “hello 张三”,表示测试成功。

Axis下载地址为http://ws.apache.org/axis/

这个就是web service框架,学一下这个例子就会了追答

亲,记得采纳哦

本回答被提问者和网友采纳

以上是关于java 怎么调用tess4j的主要内容,如果未能解决你的问题,请参考以下文章

js怎么调用java 类中方法

logutil在java中怎么调用

【java安卓】怎么调用另一个安卓activity的对象?

java怎么调用https外部接口

java怎么调用别人给的接口

用java 调用python 类里面的方法 怎么调用啊 怎么调用类web 下面的adder方法啊