如何提高tesseract ocr 训练-OCR的识别精度

如何提高Tesseract-OCR的识别精度_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
如何提高Tesseract-OCR的识别精度
上传于||文档简介
&&本​文​介​绍​了​提​高​T​e​s​s​e​r​a​c​t​-​O​C​R​识​别​精​度​的​步​骤​及​注​意​事​项​。​通​过​对​T​e​s​s​e​r​a​c​t​-​O​C​R​的​训​练​能​有​效​提​高​T​e​s​s​e​r​a​c​t​-​O​C​R​的​识​别​精​度​,​特​别​是​对​与​验​证​码​识​别​方​面​有​很​大​帮​助​。
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩2页未读,继续阅读
你可能喜欢tesseract-ocr图片识别开源工具 -
- ITeye技术网站
博客分类:
今天看同事的ppt,提到了图片识别,又tesseract-ocr,觉得不错,试一下,如果效果好可以用来做验证码的识别
/p/tesseract-ocr/
tesseract是一款开源工具,我安装了Windows版试水先
1、首先登录首页在‘下载’页面下载
tesseract-ocr-setup-xx.xx.exe
chi_sim.traineddata.gz
中文语言包
2、双击即可安装tesserract-ocr,
3、安装中文语言包,将语言包 chi_sim.traineddata.gz&& 解压到 Tesseract-OCR下
4、写测试代码:
package com.taobao.voc.
import java.io.BufferedR
import java.io.F
import java.io.FileInputS
import java.io.InputStreamR
import java.util.ArrayL
import java.util.L
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 = "D://java_tools//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");
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();
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(outputFile.getAbsolutePath()+".txt"),"UTF-8"));
while((str = in.readLine())!=null){
strB.append(str).append(EOL);
in.close();
switch(w){
msg = "Errors accessing files.There may be spaces in your image's filename.";
msg = "Cannot recongnize the image or its selected region.";
msg = "Unsupported image format.";
msg = "Errors occurred.";
tempImage.delete();
throw new RuntimeException(msg);
new File(outputFile.getAbsolutePath()+".txt").delete();
return strB.toString();
package com.taobao.voc.
import java.awt.image.BufferedI
import java.io.F
import java.io.IOE
import java.util.I
import java.util.L
import javax.imageio.IIOI
import javax.imageio.ImageIO;
import javax.imageio.ImageR
import javax.imageio.ImageWriteP
import javax.imageio.ImageW
import javax.imageio.metadata.IIOM
import javax.imageio.stream.ImageInputS
import javax.imageio.stream.ImageOutputS
import com.sun.media.imageio.plugins.tiff.TIFFImageWriteP
public class ImageIOHelper {
* 图片文件转换为tif格式
* @param imageFile 文件路径
* @param imageFormat 文件扩展名
public static File createImage(File imageFile, String imageFormat) {
File tempFile =
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 tempF
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"));
package com.taobao.voc.
import java.io.F
import java.io.IOE
public class TestOCR {
* @param args
public static void main(String[] args) {
String path = "d://test4.jpg";
String valCode = new OCR().recognizeText(new File(path), "jpg");
System.out.println(valCode);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
String path = "d://test4.jpg"; 修改为需要测试的图片,最好全中文,如果因为请更换语言包,OCR类中cmd.add("chi_sim");
浏览 18795
结果差强人意!图片内容(QQ截图生成的图片):正文 第一章 创业时代的七堂必修课 第一课 命运是一只沦落在鸡窝里的鹰 字数:1385& 话说人生大势,成败与否,在乎一心。通俗地说来,无论富家儿郎或寒门子弟,无论市井识别结果:正文 第一章 仓lj业时代的七堂必儡彦i果 第一i果 命运是一只沦落在鸡窝里的鸾 字数:1385i舌说人生大势y 成败与否, 在乎一z巳、z 通儡谷地说来, 无论富家JL直E或寒|、〕子弟, 无i仑市井兄弟,差强人意这个词不是这样用的,差强人意的意思是基本令人满意,而不是不满意,哈哈哈,下次注意啦,哈哈
浏览: 89491 次
来自: 杭州
String[] tools = StringUtils. ...
请问这种情况下python脚本里面怎么打counter呢?通常 ...
print '\t'.join([foo, strmap])+ ...Tesseract-OCR引擎&使用方法入门
OCR(Optical Character
Recognition):光学字符识别,是指对图片文件中的文字进行分析识别,获取的过程。
Tesseract:开源的OCR识别引擎,初期Tesseract引擎由HP实验室研发,后来贡献给了开源软件业,后经由Google进行改进,消除bug,优化,重新发布。当前版本为3.02
项目下载地址为:。
Windows cmd命令行使用Tesseract-OCR引擎识别验证码:
1、下载安装Tesseract-OCR引擎(3.0版本+才支持中文识别)
下载完后进行安装,默认情况下安装程序会给你配置系统环境变量,以指向安装目录(之后可以通过DOS界面在任意目录运行tesseract)。安装完成后目录如下:
tessdata 目录存放的是语言字库文件,和在命令行界面中可能用到的参数所对应的文件.
这个安装程序默认包含了英文字库。
如果想能识别中文,可以到下载对应的语言的字库文件.
简体中文字库文件下载地址为:
下载完成后解压,然后将该文件剪切到tessdata目录下去就可以了。
2、使用Tessract-OCR引擎识别验证码
打开DOS界面,输入tesseract:
如果出现如上输出,表示安装正常。
我准备了一张验证码code.jpg放在D盘根目录下<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://hi.csdn.net/attachment//0_c8r8.gif" NAME="image_operate_77297"
TITLE="Tesseract-OCR引擎&使用方法入门" />,上图
Usage:tesseract imagename outputbase [-l lang] [-psm
pagesegmode] [configfile...]
pagesegmode values are:
0 = Orientation and script detection (OSD) only.
1 = Automatic page segmentation with OSD.
2 = Automatic page segmentation, but no OSD, or OCR
3 = Fully automatic page segmentation, but no OSD. (Default)
4 = Assume a single column of text of variable sizes.
5 = Assume a single uniform block of vertically aligned text.
6 = Assume a single uniform block of text.
7 = Treat the image as a single text line.
8 = Treat the image as a single word.
9 = Treat the image as a single word in a circle.
10 = Treat the image as a single character.
-l lang and/or -psm pagesegmode must occur before
anyconfigfile.
tesseract imagename outputbase [-l lang] [-psm pagesegmode]
[configfile...]
tesseract 图片名 输出文件名 -l 字库文件 -psm pagesegmode 配置文件
tesseract code.jpg result -l chi_sim -psm 7
-l chi_sim
表示用简体中文字库(需要下载中文字库文件,解压后,存放到tessdata目录下去,字库文件扩展名为 .raineddata
简体中文字库文件名为: chi_sim.traineddata)
-psm 7 表示告诉tesseract code.jpg图片是一行文本
这个参数可以减少识别错误率. 默认为 3
configfile 参数值为tessdata\configs 和 tessdata\tessconfigs
目录下的文件名.
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。8626人阅读
详细一点的:
tesseract-ocr有2和3两个版本,不同版本训练方法稍有不同。
第3版本的训练方法官版教程在这里:
第2版的训练方法官版教程在这里:
我使用的是最新的3.01版本的。训练所需准备:
1.下载并安装3.01版本的tesseract。事实上并不需要安装这步骤,我下载的是,解压即可,这里我解压到E:\Tesseract-ocr目录。
2.下载并安装&工具,这是一个Box file editors,用来编辑训练文件的,直接下载地址在。这个软件是用java写的,运行需要安装jre,好在这个东西比.net好装多了,怎么运行可以见它的readme文件。
3.一张用来训练的tiff&#26684;式图片。
在不通过训练的前提下,使用tesseract来识别一个订单号的内容,如图发现错误率很高,希望通过训练来提高准确率。
训练过程:
1.通过合并10张如上图的图片合并为一张tiff&#26684;式的图片,如何合并呢?通过jTessBoxEditor的Merge Tiff 来完成,不过他的小缺点就是只能合并多张tiff&#26684;式的,如果你的图片是jpg的,需要先转换。生成后的tiff图片叫做orderNo.tif
2.Make Box Files。在orderNo.tif所在的目录下打开一个命令行,输入:
E:\Tesseract-ocr\tesseract.exe orderNo.tif orderNo batch.nochop makebox
来生成一个box文件,该文件记录了tesseract识别出来的每一个字和其位置坐标。
3.使用jTessBoxEditor打开orderNo.tif文件,需要记住的是第2步生成的orderNo.box要和这个orderNo.tif文件同在一个目录下。逐个校正文字,后保存。
4.Run Tesseract for Training。输入命令:
E:\Tesseract-ocr\tesseract.exe orderNo.tif orderNo nobatch box.train
5.Compute the Character Set。输入命令:
E:\Tesseract-ocr\unicharset_extractor.exe orderNo.box
6.新建文件“font_properties”。如果是3.01版本,那么需要在目录下新建一个名字为“font_properties”的文件,并且输入文本 :
orderNo 0 0 0 0 0
大致意思就是说orderNo这个语言的字体为普通字体。
并执行命令:
E:\Tesseract-ocr\mftraining.exe -F font_properties -U unicharset orderNo.tr
7.Clustering。输入命令:
E:\Tesseract-ocr\cntraining.exe orderNo.tr
8.此时,在目录下应该生成若干个文件了,把unicharset, inttemp, normproto, pffmtable这四个文件加上前缀“orderNo.”。然后输入命令:
E:\Tesseract-ocr\combine_tessdata.exe orderNo.
会显示一个结果如:
Combining tessdata files
TessdataManager combined tesseract data files.
Offset for type 0 is -1
Offset for type 1 is 108
Offset for type 2 is -1
Offset for type 3 is 1660
Offset for type 4 is 327545
Offset for type 5 is 327781
Offset for type 6 is -1
Offset for type 7 is -1
Offset for type 8 is -1
Offset for type 9 is -1
Offset for type 10 is -1
Offset for type 11 is -1
Offset for type 12 is –1
必须确定的是第2、4、5、6行的数据不是-1,那么一个新的字典就算生成了。
此时目录下“orderNo.traineddata”的文件拷贝到tesseract程序目录下的“tessdata”目录。
以后就可以使用该该字典来识别了,例如:
tesseract.exe test.jpg result –l orderNo
通过训练出来的新语言,识别率提高了不少。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:305527次
积分:4224
积分:4224
排名:第3663名
原创:104篇
转载:50篇
评论:223条
(5)(1)(2)(2)(1)(3)(3)(3)(3)(4)(4)(2)(2)(1)(1)(1)(1)(2)(1)(3)(1)(4)(2)(8)(1)(9)(2)(2)(6)(5)(10)(4)(1)(2)(3)(4)(3)(3)(5)(4)(1)(3)(4)(1)(1)(1)(1)(3)(2)(3)(2)(1)(1)(3)(1)(3)如何提高Tesseract-OCR的识别精度_百度知道
如何提高Tesseract-OCR的识别精度
提问者采纳
loadrunner工具识别tesseract.exe命令手任何目录都难道通LR打终端窗口windowspath环境变量识别稍严重看能修改批处理文件啦路径指定tesseract安装目录才
来自团队:
其他类似问题
为您推荐:
ocr的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 tesseract ocr java 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信