java识别图片中文字技术
java文字识别程序的关键是寻找一个可以调用的OCR引擎。tesseract-ocr就是一个这样的OCR引擎,在1985年到1995年由HP实验室开发,现在在Google。tesseract-ocr 3.0发布,支持中文。不过tesseract-ocr 3.0不是图形化界面的客户端,别人写的FreeOCR图形化客户端还不支持导入新的 3.0 traineddata。但这标志着,现在有自由的中文OCR软件了。
java中使用tesseract-ocr3.01的步骤如下:
1.下载安装tesseract-ocr-setup-3.01-1.exe(3.0以上版本才增加了中文识别)
2.在安装向导中可以选择需要下载的语言包。
3.到网上搜索下载java图形处理所需的2个包:jai_imageio-1.1-alpha.jar,swingx-1.6.1.jar
4.java程序清单:
ImageIOHelper 类:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.Locale;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;
import com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam;
public class ImageIOHelper {
public static File createImage(File imageFile, String imageFormat) {
File tempFile = null;
try {
Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(imageFormat);
ImageReader reader = readers.next();
ImageInputStream iis = ImageIO.createImageInputStream(imageFile);
reader.setInput(iis);
//Read the stream metadata
IIOMetadata streamMetadata = reader.getStreamMetadata();
//Set up the writeParam
TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(Locale.CHINESE);
tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);
//Get tif writer and set output to file
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("tiff");
ImageWriter writer = writers.next();
BufferedImage bi = reader.read(0);
IIOImage image = new IIOImage(bi,null,reader.getImageMetadata(0));
tempFile = tempImageFile(imageFile);
ImageOutputStream ios = ImageIO.createImageOutputStream(tempFile);
writer.setOutput(ios);
writer.write(streamMetadata, image, tiffWriteParam);
ios.close();
writer.dispose();
reader.dispose();
} catch (IOException e) {
e.printStackTrace();
}
return tempFile;
}
private static File tempImageFile(File imageFile) {
String path = imageFile.getPath();
StringBuffer strB = new StringBuffer(path);
strB.insert(path.lastIndexOf('.'),0);
return new File(strB.toString().replaceFirst("(?<=//.)(//w+)$", "tif"));
}
}
OCR 类:
package com.hhp.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.jdesktop.swingx.util.OS;
public class OCR {
private final String LANG_OPTION = "-l"; //英文字母小写l,并非数字1
private final String EOL = System.getProperty("line.separator");
private String tessPath = "C://Program Files (x86)//Tesseract-OCR";
//private String tessPath = new File("tesseract").getAbsolutePath();
public String recognizeText(File imageFile,String imageFormat)throws Exception{
File tempImage = ImageIOHelper.createImage(imageFile,imageFormat);
File outputFile = new File(imageFile.getParentFile(),"output");
StringBuffer strB = new StringBuffer();
List<String> cmd = new ArrayList<String>();
if(OS.isWindowsXP()){
cmd.add(tessPath+"//tesseract");
}else if(OS.isLinux()){
cmd.add("tesseract");
}else{
cmd.add(tessPath+"//tesseract");
}
cmd.add("");
cmd.add(outputFile.getName());
cmd.add(LANG_OPTION);
cmd.add("chi_sim");
//cmd.add("eng");
ProcessBuilder pb = new ProcessBuilder();
pb.directory(imageFile.getParentFile());
cmd.set(1, tempImage.getName());
pb.command(cmd);
pb.redirectErrorStream(true);
Process process = pb.start();
//tesseract.exe 1.jpg 1 -l chi_sim
int w = process.waitFor();
//删除临时正在工作文件
tempImage.delete();
if(w==0){
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(outputFile.getAbsolutePath()+".txt"),"UTF-8"));
String str;
while((str = in.readLine())!=null){
strB.append(str).append(EOL);
}
in.close();
}else{
String msg;
switch(w){
case 1:
msg = "Errors accessing files.There may be spaces in your image's filename.";
break;
case 29:
msg = "Cannot recongnize the image or its selected region.";
break;
case 31:
msg = "Unsupported image format.";
break;
default:
msg = "Errors occurred.";
}
tempImage.delete();
throw new RuntimeException(msg);
}
new File(outputFile.getAbsolutePath()+".txt").delete();
return strB.toString();
}
}
测试类TestOCR :
import java.io.File;
import java.io.IOException;
import com.hhp.util.OCR;
public class OcrTest {
public static void main(String[] args) {
String path = "C://temp//OCRcode//4.png";
System.out.println("ORC Test Begin......");
try {
String valCode = new OCR().recognizeText(new File(path), "png");
System.out.println(valCode);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("ORC Test End......");
}
}
经过测试,tesseract-ocr 3.01的文字识别率很高,对于网站中常见的验证码识别率也很高。
java识别图片中文字技术相关推荐
- 单张、批量识别图片中文字(写入txt文件、窗口视图创建、打包.exe文件)(百度文字识别SDK+Python的GUI之tklinker+打包pyinstaller)
昨天我姐问我有没有软件可以批量识别图片上的文字,她在帮客户做资料整理,但是用的方法只能一张一张上传识别,不仅效率低还浪费时间. 我就找了找批量识别的软件,下载下来觉得:嗯?不错,界面也挺好,小东西做 ...
- python 识别图片中的中文_python识别图片中文字的方法
Tesseract 文字识别是ORC的一部分内容,ORC的意思是光学字符识别,通俗讲就是文字识别.Tesseract是一个用于文字识别的工具,我们结合Python使用可以很快的实现文字识别.但是在此之 ...
- python批量识别图片中文字_python实现中文图片文字识别--OCR about chinese text--tesseract...
0.我的环境: win7 32bits python 3.5 pycharm 5.0 1.相关库 安装pillow: pip install pillow 安装tesseract: 自带了英文语言包, ...
- 深入学习使用ocr算法识别图片中文字的方法
公司有个需求,简单点说需要从一张图片中识别出中文,通过python来实现,当然其他程序也行,只要能实现,而小编主要学习python,所以就提了python.一个小白在网上遨游了一天,终于找到一丝丝思绪 ...
- python批量识别图片中文字_Python识别图片中的文字
一.前言 不知道大家有没有遇到过这样的问题,就是在某个软件或者某个网页里面有一篇文章,你非常喜欢,但是不能复制.或者像百度文档一样,只能复制一部分,这个时候我们就会选择截图保存.但是当我们想用到里面的 ...
- python批量识别图片中文字_如何用Python识别图片中的文字?
一.前言 不知道大家有没有遇到过这样的问题,就是在某个软件或者某个网页里面有一篇文章,你非常喜欢,但是不能复制.或者像百度文档一样,只能复制一部分,这个时候我们就会选择截图保存.但是当我们想用到里面的 ...
- 一段比较浅显易懂的java识别pdf 文字及图片
使用pdfbox及orc进行pdf文件的文字及图片的识别 pom设置相关依赖 <!--pdf相关依赖开始--><dependency><groupId>org.ap ...
- python使用aip库识别图片中文字
一.获取百度智能云API的AppID / API Key / Secret Key 1.创建应用 百度智能云登录地址:https://login.bce.baidu.com/ 2.立即创建 3.得到A ...
- 识别图片中文字的三种方法/图片转文字
一.钉钉 钉钉内置了很多小功能.打开手机钉钉,点击左下角的消息按钮,然后点击右上角的+号-扫一扫,点击拍图识字选中需要识别的文字即可. 二.QQ 打开手机QQ,点击右上角的+号-扫一扫之后,点击转文字 ...
最新文章
- 技术驰援抗疫一线, Python 线上峰会免费学!
- 实例分割最新最全面综述:从Mask R-CNN到BlendMask
- pandas对dataframe的数据列进行随机抽样(Random Sample of Columns):使用sample函数进行数据列随机抽样(有放回的随机抽样,replacement)
- Android Activtity Security
- css3魔方3乘3每层旋转_在玩魔方中学数学,原来魔方与矩阵还有这样的关系
- 输入数字自动找规律的软件_WPS2019 填充柄的顺序式填充、复制式填充、规律填充、自定义填充...
- SpringBoot 阶段总结
- 你真的了解iaas、PaaS、SaaS的区别吗?
- MTK 驱动开发(38)--- getevent 和 sendevent
- 古风祥云PNG免抠素材,喜欢吗?
- java知识总结-25
- 没有方案你抱怨;有了方案你会认真看吗?
- 基于stm32单片机外文文献_(强烈推荐)基于stm32的温度控制毕业论文设计
- 如何将KUX格式转换为MP4格式
- 电路分析超详细思维导图
- 浪潮提出“计算+”挖大数据商机
- 微信小程序-抖音/字节小程序
- 计算机二级中用函数制作工资条,教你用vlookup函数快速制作工资条
- 使用vue解决vs编辑器格式化分号逗号问题
- 前端开发全家桶:UI组件 开发框架 服务端 辅助工具 应用实例 Demo示例
热门文章
- php项目排期表模板,最近在开发后台管理,想问下广告排期表怎么做?
- 关于将LIUNX下的图形化操作倾向WINDOWS的几个东西
- 华为手机不小心点了始终_华为手机有一个设置,用过一次就再也离不开了,你打开了吗?...
- 传奇微端配置不更新怎么办?
- Docker容器内存占用过高解决方法
- 从后端开发转大数据开发怎么样?
- 百度地图 鼠标绘制工具BUG修复(地图自动平移)
- 乡村爱情里的赵四;逗的大家笑尿裤子了
- scalac: Token not found...
- 06年底写的5年职业规划与珠海金山邮件面试题回复