请选择 进入手机版 | 继续访问电脑版

我爱科技论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 642|回复: 0

[技术分享] 【java进阶】Java中使用Tess4J实现图片中文字的识别功能

[复制链接]

696

主题

743

帖子

7934

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7934

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

发表于 2018-4-11 10:02:34 | 显示全部楼层 |阅读模式
1.首先进入Tess4J官网去下载最新的Ocr识别包,下载地址:https://sourceforge.net/projects/tess4j/files/tess4j/
1.jpg
2.下载完毕之后开始解压到你的本地,解压后的目录如下。
2.jpg
3.把/dist路径下面的tess4j-3.4.6.jar以及lib目录下面的所有jar包导入到你新建的项目里面去。

3.jpg
4. 开始编写代码,识别测试,源码如下。
  1. package test;

  2. import java.awt.image.BufferedImage;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;

  7. import javax.imageio.ImageIO;

  8. import net.sourceforge.tess4j.ITesseract;
  9. import net.sourceforge.tess4j.Tesseract;
  10. import net.sourceforge.tess4j.TesseractException;
  11. import net.sourceforge.tess4j.util.ImageHelper;

  12. public class CheckNodeTest {
  13.         public static void main(String[] args) {
  14.                 try {
  15.                         
  16.                         
  17.                         File imageFile = new File("D:\\Tesseract-OCR\\doc\\2.jpg");// 图片位置
  18.                         ITesseract instance = new Tesseract(); // JNA Interface Mapping
  19.                         instance.setDatapath("D:\\Tesseract-OCR\\Tess4J\\tessdata");// 设置tessdata位置
  20.                         instance.setLanguage("eng");// 选择字库文件(只需要文件名,不需要后缀名)
  21.                         String result = instance.doOCR(imageFile);// 开始识别
  22.                         
  23.                         BufferedImage img = change(new File("D:\\Tesseract-OCR\\doc\\2.jpg"));
  24.                         String rs = instance.doOCR(img);

  25.                         System.out.println("图片实际为:xxxx" + "\t图片识别结果为:" + result);// 打印图片内容
  26.                         System.out.println("图片实际为:xxxx" + "\t图片识别结果为:" + rs);// 打印图片内容
  27.                 } catch (TesseractException e) {
  28.                         e.printStackTrace();
  29.                 }
  30.         }

  31.         
  32.         
  33.         public static BufferedImage change(File file) {

  34.                 // 读取图片字节数组
  35.                 BufferedImage textImage = null;
  36.                 try {
  37.                         InputStream in = new FileInputStream(file);
  38.                         BufferedImage image = ImageIO.read(in);
  39.                         textImage = ImageHelper
  40.                                         .convertImageToGrayscale(ImageHelper.getSubImage(image, 0, 0, image.getWidth(), image.getHeight())); // 对图片进行处理
  41.                         textImage = ImageHelper.getScaledInstance(image, image.getWidth() * 5, image.getHeight() * 5); // 将图片扩大5倍

  42.                 } catch (IOException e) {
  43.                         e.printStackTrace();
  44.                 }

  45.                 return textImage;
  46.         }
  47. }
复制代码
测试效果如下:
1.png
  1. 图片实际为:xxxx        图片识别结果为:ASDFESA. DA54


  2. 图片实际为:xxxx        图片识别结果为:ASDF E 5A . DA54
复制代码


2.jpg
  1. 图片实际为:xxxx        图片识别结果为:Mt


  2. 图片实际为:xxxx        图片识别结果为:mm
复制代码
这种方式识别对于普通的文字识别是有效的,但是对于一些网站的比较模糊一点的验证码识别基本上就失效了哈,大家可以看下有没有更好的方法去改进一下。

注意事项:
1.上面的测试实例中我写了一个将图片放大一定比例的函数,用于比对识别效果;
2.本项目我是使用Maven工具搭建的,但是这里直接将下载的jar包文件导入到了我的工程中去,因此没有必要再去pom.xml文件中去配置这个插件的版本信息。





上一篇:【基础部分】java编写排序算法总结整理
下一篇:【java进阶】如何在eclipse中通过Maven搭建普通java项目(超详细)
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案; 如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

微信扫一扫

快速回复 返回顶部 返回列表