当我浏览http://code.google.com/p/tesseract-ocr并下载了几个文件下来之后顿时感到一头雾水,不知该如何下手。网上看到有人在linux操作系统下的实现,
如:
利用开源程序(ImageMagick+tesseract-ocr)实现图像验证码识别
但却很少看到在windows下的相关文章介绍。
接下来我将一步步讲述如何采用tesseract-ocr识别含有中文的图片。
1、下载tesseract-ocr(注意3.0版本之后才支持中文的识别)
tesseract-ocr-setup-3.00.exe
chi_sim.traineddata.gz
2、安装tesseract-ocr
解压缩,双击tesseract-ocr-setup-3.00.exe即可根据提示一步步安装,本人安装的目录是:D:/Program
Files/Tesseract-OCR
在该目录下可看到tesseract.exe文件,这就是我们后面程序中会调用到的运行进程。
3、自定义安装语言包
D:/Program Files/Tesseract-OCR目录下找到/tessdata目录,其是用来存放语言包,可把chi_sim.traineddata.gz解压缩之后的chi_sim.traineddata文件复制到该目录下即可。
4、编写测试代码
在编写代码之前下载两个jar包:jai_imageio-1.1-alpha.jar、swingx-1.0.jar,可在www.findjar.com网站上去下载。
-
importjava.awt.image.BufferedImage;
-
importjava.io.File;
-
importjava.io.IOException;
-
importjava.util.Iterator;
-
importjava.util.Locale;
-
-
importjavax.imageio.IIOImage;
-
importjavax.imageio.ImageIO;
-
importjavax.imageio.ImageReader;
-
importjavax.imageio.ImageWriteParam;
-
importjavax.imageio.ImageWriter;
-
importjavax.imageio.metadata.IIOMetadata;
-
importjavax.imageio.stream.ImageInputStream;
-
importjavax.imageio.stream.ImageOutputStream;
-
-
importcom.sun.media.imageio.plugins.tiff.TIFFImageWriteParam;
-
-
publicclassImageIOHelper{
-
-
-
-
-
-
-
publicstaticFilecreateImage(FileimageFile,StringimageFormat){
-
FiletempFile=null;
-
try{
-
Iterator<ImageReader>readers=ImageIO.getImageReadersByFormatName(imageFormat);
-
ImageReaderreader=readers.next();
-
-
ImageInputStreamiis=ImageIO.createImageInputStream(imageFile);
-
reader.setInput(iis);
-
-
IIOMetadatastreamMetadata=reader.getStreamMetadata();
-
-
-
TIFFImageWriteParamtiffWriteParam=newTIFFImageWriteParam(Locale.CHINESE);
-
tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);
-
-
-
Iterator<ImageWriter>writers=ImageIO.getImageWritersByFormatName("tiff");
-
ImageWriterwriter=writers.next();
-
-
BufferedImagebi=reader.read(0);
-
IIOImageimage=newIIOImage(bi,null,reader.getImageMetadata(0));
-
tempFile=tempImageFile(imageFile);
-
ImageOutputStreamios=ImageIO.createImageOutputStream(tempFile);
-
writer.setOutput(ios);
-
writer.write(streamMetadata,image,tiffWriteParam);
-
ios.close();
-
-
writer.dispose();
-
reader.dispose();
-
-
}catch(IOExceptione){
-
e.printStackTrace();
-
}
-
returntempFile;
-
}
-
-
privatestaticFiletempImageFile(FileimageFile){
-
Stringpath=imageFile.getPath();
-
StringBufferstrB=newStringBuffer(path);
-
strB.insert(path.lastIndexOf('.'),0);
-
returnnewFile(strB.toString().replaceFirst("(?<=//.)(//w+)$","tif"));
-
}
-
-
}
-
importjava.io.BufferedReader;
-
importjava.io.File;
-
importjava.io.FileInputStream;
-
importjava.io.InputStreamReader;
-
importjava.util.ArrayList;
-
importjava.util.List;
-
-
importorg.jdesktop.swingx.util.OS;
-
-
publicclassOCR{
-
privatefinalStringLANG_OPTION="-l";
-
privatefinalStringEOL=System.getProperty("line.separator");
-
privateStringtessPath="D://ProgramFiles//Tesseract-OCR";
-
-
-
publicStringrecognizeText(FileimageFile,StringimageFormat)throwsException{
-
FiletempImage=ImageIOHelper.createImage(imageFile,imageFormat);
-
FileoutputFile=newFile(imageFile.getParentFile(),"output");
-
StringBufferstrB=newStringBuffer();
-
List<String>cmd=newArrayList<String>();
-
if(OS.isWindowsXP()){
-
cmd.add(tessPath+"//tesseract");
-
}elseif(OS.isLinux()){
-
cmd.add("tesseract");
-
}else{
-
cmd.add(tessPath+"//tesseract");
-
}
-
cmd.add("");
-
cmd.add(outputFile.getName());
-
cmd.add(LANG_OPTION);
-
cmd.add("chi_sim");
-
-
-
ProcessBuilderpb=newProcessBuilder();
-
pb.directory(imageFile.getParentFile());
-
-
cmd.set(1,tempImage.getName());
-
pb.command(cmd);
-
pb.redirectErrorStream(true);
-
-
Processprocess=pb.start();
-
-
intw=process.waitFor();
-
-
-
tempImage.delete();
-
-
if(w==0){
-
BufferedReaderin=newBufferedReader(newInputStreamReader(newFileInputStream(outputFile.getAbsolutePath()+".txt"),"UTF-8"));
-
-
Stringstr;
-
while((str=in.readLine())!=null){
-
strB.append(str).append(EOL);
-
}
-
in.close();
-
}else{
-
Stringmsg;
-
switch(w){
-
case1:
-
msg="Errorsaccessingfiles.Theremaybespacesinyourimage'sfilename.";
-
break;
-
case29:
-
msg="Cannotrecongnizetheimageoritsselectedregion.";
-
break;
-
case31:
-
msg="Unsupportedimageformat.";
-
break;
-
default:
-
msg="Errorsoccurred.";
-
}
-
tempImage.delete();
-
thrownewRuntimeException(msg);
-
}
-
newFile(outputFile.getAbsolutePath()+".txt").delete();
-
returnstrB.toString();
-
}
-
}
-
importjava.io.File;
-
importjava.io.IOException;
-
-
publicclassTestOCR{
-
-
-
-
-
publicstaticvoidmain(String[]args){
-
Stringpath="d://test//chi.jpg";
-
try{
-
StringvalCode=newOCR().recognizeText(newFile(path),"jpg");
-
System.out.println(valCode);
-
}catch(IOExceptione){
-
e.printStackTrace();
-
}catch(Exceptione){
-
e.printStackTrace();
-
}
-
}
-
-
}
通过本人的测试对于中文的识别虽然不是很完美,至少其可支持了,但最大的缺点就是速度慢。中文本来就很复杂,而且其语言包就达到50多M,和英文语言包比起来真是..............
测试图片,可右击“图片另存为”
解析输出结果:
一、 引 孟4
1. 1 从体验经济到体验设计驷
随着社会生产力发展水平的提高和人类需求层次的升级, 体验经济也就成
为了经济发展的必然趋势。 体验经济 日 渐显现, 出现了服务于它的体验设计。 、
设计是创新的重要组成部分。 茌强调 目 主创新的六环i竞下, 申国的企业应
该兖分关注体验设计的新趋势‘。体验设计的理论正茌成为现代企业开发产品和
服务顶 目 的重要依据。 现阶段, IT 领域很早就注意到了这一点, 百度、 腾讯、
支付宝、 阿里巴巴等着属设有专门的用户体验部, 为其产品和服务增加附加价值,
也更六程度她让用户满意, 最终荻得了最佳企业效益。 、
同时7 随看现代产品设计思想的成熟, 产品设计也越来越聚焦于人本身一
7人的存茌, 人的需要7 持别是人的情感需要。 设计与人, 人与设计, 设计是
否可以有长远意义, 是否可以印证人的真买存茌, 是否可以帮助人们理解 目 己,
认识世界。 这个问题己偏 同于哲学, 但却确买是设计这种文化形式的 内茌诉求。
越来越多的产品遍过设计, 茌与人交互的过程申7 使人产生愉悦的体验, 并茌
这个体验的后期, 让人产生反思, 遍过反思得以认识自 己7 发展自 己。 找想这
点是设计成为一种优势文化, 而所要肩 负 的必要责任。 ~
测试中发现的几个注意点:
1、若是一份英文文档其对英文字母o绝大部分会识别为数字0。所以若是英文和数字的文档,最好不要加入中文语言包,而是引入eng.traineddata语言包到D:/Program Files/Tesseract-OCR/tessdata目录下。
看到OCR类31-32行代码
cmd.add("chi_sim");
//cmd.add("eng");
去掉 //cmd.add("eng");前的注释,但记得在cmd.add("chi_sim");前加上注释哦,不然你就看不到效果了哦。
2、测试中还发现一个问题,有时候在目录下已经生成临时文件并且识别出的文字写入到output.txt,但是在int w = process.waitFor();则阻塞了停止运行再也没有反应了,以致控制台始终没有打印出文字。
解析(参考):刚开始想到直接去掉这个语句算了,但是运行的时候会报运行错误。最后在http://www.cnblogs.com/xxpal/articles/824963.html看到下面一段文字说明:在Windows平台上,运行被调用程序的DOS窗口在程序执行完毕后往往并不会自动关闭,从而导致Java应用程序阻塞在waitfor()语句。导致该现象的一个可能的原因是,该可执行程序的标准输出比较多,而运行窗口的标准输出缓冲区不够大。解决的办法是,利用Java中Process类提供的方法让Java虚拟机截获被调用程序的DOS运行窗口的标准输出,在waitfor()命令之前读出窗口的标准输出缓冲区中的内容。
解决办法:在int w = process.waitFor();代码行前面加上
String s;
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
while((s=bufferedReader.readLine()) != null);
int w = process.waitFor();
再次运行试试看吧。
分享到:
相关推荐
python图片中文识别引擎Tesseract-OCR,支持英文中文的识别,语言库丰富可选择性安装需要的语言,解压之后直接点击安装下一步即可。安装完成之后设置pytesseract.py中的tesseract_cmd为'C:/Program Files (x86)/...
tesseract-ocr的语言库识别库文件,下载解压后放到tesseract-ocr安装目录下的tessdata 目录,存放的是语言字库文件,和在命令行界面中可能用到的参数所对应的文件. 这个安装程序默认包含了英文字库。
本资源提供Python文字识别之tesseract-ocr安装包和中文语言包chi_sim.traineddata免费下载。 tesseract-ocr:tesseract-ocr-w64-setup-v5.1.0.20220510.exe; 中文语言包:chi_sim.traineddata
tesseract-ocr-setup-3.05.01dev-20170510.exe 用于OCR识别
tesseract-ocr3.02.02(包含简体中文语言包) 使用方法:解压缩文件,在dos环境下运行tesseract.exe; 识别英文,请输入命令 tesseract test1.png test1 -l eng;(test1.png为要识别的图片,test1为输出图片,格式为...
tesseract-ocr安装包和中文语言包.rar
tesseract-ocr 验证码识别 32位 最新版 4.1 tesseract-ocr 验证码识别 32位 最新版 4.1 tesseract-ocr 验证码识别 32位 最新版 4.1 tesseract-ocr 验证码识别 32位 最新版 4.1
tesseract-ocr-setup-3.01-1谷歌开源ocr技术
一个Google支持的开源的OCR图文识别开源项目。去持多语言(当前3.02 版本支持包括英文,简体中文,繁体中文),支持Windows,Linux,Mac OSX 多平台。使用中Tesseract 的识别率非常高。可以参考网上的相关资料进行对...
tesseract-ocr-setup-3.02.02-图片识别,可以使用,尽情放心!~!
java文字识别程序的关键是寻找一个可以调用的OCR引擎。tesseract-ocr就是一个这样的OCR引擎,在1985年到1995年由HP实验室开发,现在在Google。tesseract-ocr 3.0发布,支持中文。
tesseract-ocr 3.02的中文字体库
tesseract-ocr 光学字符识别安装程序 3.02.02版本 tesseract-ocr 光学字符识别安装程序 3.02.02版本
Tesseract-OCR识别,使用C#的winform开发,可以运行。里面有上传图片和DLL。 1、.NET Framework 4.5 2、C# Winform
tesseractocr中的中文训练库,解压到Tesseract-OCR\tessdata目录
tesseract-ocr的简体中文语言训练数据,来自google官网,可以用于中文的图片验证码识别,对于比较标准的字体还是有不错的识别率的
tesseract-ocr-setup-3.05.02-20180621,tesseract稳定版本
tesseract-ocr就是一个这样的OCR引擎,在1985年到1995年由HP实验室开发,现在在Google。tesseract-ocr 3.0发布,支持中文。
tesseract-ocr-w64-setup-v5.0.0.20211201