tesseract-ocr

2023-11-06

 

转自:http://www.cnblogs.com/zcsor/archive/2011/02/21/1959555.html

关于tesseract-ocr3的训练和使用

众所周知,这是一个出色的字符识别软件。这个开源项目可以在http://code.google.com/p/tesseract-ocr/downloads/list下载。

在使用时,建议使用3而不要使用2,因为一些原因,2虽然可以直接用在工程,但是由于一些显而易见的BUG和其他原因,多导致程序无法运行甚至崩溃。所以建议使用命令行版本的3 。

除了下载tesseract安装程序以外,还可以在下载页面下载一些语言库,当然,也可以在安装过程中选择一些语言库来进行安装。

 

一、训练

在很多时候,默认的字库等完全可以高准确度的识别,但是有些时候我们需要训练自己的库来使用。训练步骤如下:

注:

A、均以DOS命令为例,即将每步下面的命令保存为.BAT运行,或运行CMD进入tesseract所在目录运行

B、注意保证文件名的一致性(此处均为DDT)

0、复制training目录下的全部文件到tesseract3所在目录

copy .\training\*.exe .\

1、标记边框

tesseract ddt.tif ddt -l eng digits batch.nochop makebox

解释一下

ddt.tif为要识别的文件,支持jpg,gif,tiff等格式,建议用tif

ddt 为要保存的文件名(自动添加扩展名.box)

-l eng 使用的库,这个参数可以让我们选择用哪个字库来标记边框

后面的都是配置文件了,也就是tesseract的其他参数被以文件形式加载,而不是直接输入参数

digits指定了只识别0-9的数字(当然你可以编辑它,使它包含更多的字符),当你不需要指定时,一定要去掉这个参数,但使用这种字符集限定,可以最大程度上减少被错误识别搞的你编辑ddt.box头昏脑胀的几率。

注:

这一步非常关键,但也经常出现问题,即使你在http://code.google.com/p/bbtesseract/downloads/list下载了bbtesseract也是如此,所以我感觉应该自己编一个边框识别,但没有时间做。完全可以将命令写入到软件里,实现图形化。所以,注意编辑你生成的ddt.box文件,保证字符都被识别且边框正确。

这里也有一个小技巧,例如我做过这样一个tif:1.2-34567089,在这一步的时候,只识别了2-9这一部分,于是我修改tif为:001.2-34567089,就全部识别了。也许可以给你一些启示。

2、形成语言库

tesseract ddt.tif ddt -l eng digits nobatch box.train
unicharset_extractor ddt.box
rename unicharset ddt.unicharset
mftraining -U unicharset -O ddt.unicharset ddt.tr
rename inttemp ddt.inttemp
rename pffmtable ddt.pffmtable
rename Microfeat ddt.Microfeat
cntraining ddt.tr
rename normproto ddt.normproto
combine_tessdata ddt.

这里面包含了若干步骤,但其他人扒的“教程”已经啰嗦很多了,不再啰嗦。

注:那几个rename是必要的,因为生成的文件只有扩展名。只要注意了这些,就没问题了。

3、测试语言库

copy ddt.traineddata .\tessdata\ddt.traineddata

tesseract ddt.tif ddt -l ddt
notepad ddt.txt

如果测试失败了,你应该检查:

A、是否tif宽度太小,如果是,我建议你在下面增加一行,就是说把1行改成2行,增加什么呢,随意增加一些你字库里面的字符,但最好和图像一样宽。

B、如果还没正确识别,回头仔细检查你的ddt.box

 

如果你失败了,记得清理前面生成的文件,可以使用一下命令:

copy ddt.tif tmp.tif
del ddt.* /f /s
copy tmp.tif ddt.tif
del tmp.tif

然后从第一步重新来过。

 

二、使用

使用时,只需要注意,对于单行并且字符数较少的图像,如果不识别,最好是在下面添加一行无用行,并保证该行基本达到图像宽。

注:

在使用时,可能会发生找不到字库的情况(尤其当你卸载后重装tesseract时),此时,应修改

HKEY_CURRENT_USER\Environment\TESSDATA_PREFIX的值为你的tesseract所在目录。

 

三、示例

最后给出一个tesseract3在VB.NET下使用的示例代码。

Public Class TessOCR

    Dim path As String = My.Application.Info.DirectoryPath & "\tesseract3\"

    Sub New()
        My.Computer.Registry.CurrentUser.OpenSubKey("Environment", True).SetValue("TESSDATA_PREFIX", path)
    End Sub

    Public Function Tess3OCR(ByVal Rect As Rectangle, ByVal clr As Integer) As String
        '建立图像,注意屏幕复制时使用SourceCopy以符合OCR要求的图像格式,否则出错或直接关闭
        Dim bmp As Bitmap = New Bitmap(Rect.Width, Rect.Height * 2)
        Dim gr As Graphics = Graphics.FromImage(bmp)
        gr.Clear(Color.White)
        gr.CopyFromScreen(Rect.Location, Point.Empty, Rect.Size, CopyPixelOperation.SourceCopy)
        '校正为白纸黑字
        For y As Integer = 0 To bmp.Height - 1
            For x As Integer = 0 To bmp.Width - 1
                If bmp.GetPixel(x, y).ToArgb = clr Then bmp.SetPixel(x, y, Color.Black) Else bmp.SetPixel(x, y, Color.White)
            Next
        Next
        Dim str As String = IIf(clr = AngleColor, "45.000000", "0.000000")
        gr.DrawString(str, New Font("Arial Black", 14), Brushes.Black, 0, Rect.Height)

        bmp.Save(path & "tmp.tif", System.Drawing.Imaging.ImageFormat.Tiff)
        Shell(path & "tesseract " & path & "tmp.tif " & path & "tmp -l ddt digits", AppWinStyle.Hide, True)
        My.Computer.FileSystem.DeleteFile(path & "tmp.tif")
        Dim ret As String = My.Computer.FileSystem.ReadAllText(path & "tmp.txt").Split(vbCrLf)(0)
        My.Computer.FileSystem.DeleteFile(path & "tmp.txt")
        Return ret
    End Function

End Class

在代码的new函数中,我修改了注册表,以防止出错,更好的做法应该是在这之前记录原始值并在类销毁时恢复。之后,指出了屏幕复制时可能存在的一些问题,当然,如果你是取验证码啥的,那就不用关心这些了。然后对图像进行了简单的校正,需要注意的是,必须校正为白底黑字才行,否则不识别。而后,我在下面添加了一行无用的文字,并在返回值时进行了适当处理。再有一点需要注意的是,shell函数的最后一个参数,指出了等待调用进程结束,如果你要在vb6当中使用,这里就需要用api来实现等待——而不要用sleep等定时等待函数,那将会使得你的程序不够健壮。

 

转自:http://blog.csdn.net/foxwit/article/details/6547465

OCR识别引擎tesseract使用方法

最近一直跟OCR打交道,学习了下google的OCR引擎TESSERACT,是个很好的识别工具。tesseract-3.0已支持版面分析,功能很强大。安装tesseract前可选择性地安装leptonica和libtiff。不过建议先安装这两个库。不安装tiff的话只能处理bmp文件。

     这里只是说明怎么识别中文。依次安装好libtiff,leptonica和tesseract后,下载简体中文和繁体中文的训练数据,在tesseract的下载页可以找到。放到某个目录的tessdata文件夹下。然后设置环境变量TESSDATA_PREFIX=tessdata的目录。然后,新建一个ocr.cpp文件,编写如下代码:

#include <mfcpch.h>

#include <ctype.h>

#include <sys/time.h>

#include "applybox.h"

#include "control.h"

#include "tessvars.h"

#include "tessedit.h"

#include "baseapi.h"

#include "thresholder.h"

#include "pageres.h"

#include "imgs.h"

#include "varabled.h"

#include "tprintf.h"

#include "stderr.h"

#include "notdll.h"

#include "mainblk.h"

#include "output.h"

#include "globals.h"

#include "helpers.h"

#include "blread.h"

#include "tfacep.h"

#include "callnet.h"

#include "allheaders.h"

int main(int argc,char **argv){

if(argc!=3){

printf("usage:%s <bmp file> <txt file>/n",argv[0]);

return -1;

}

char *image_file=argv[1];

char *txt_file=argv[2];

STRING text_out;

struct timeval beg,end;

tesseract::TessBaseAPI  api;

IMAGE image;

api.Init(argv[0], "chi_sim", NULL, 0, false);//初始化api对象

api.SetPageSegMode(tesseract::PSM_AUTO);//设置自动进行版面分析

api.SetAccuracyVSpeed(tesseract::AVS_FASTEST);//要求速度最快

if (image.read_header(image_file) < 0) {//读取bmp文件的元信息

printf("Read of file %s failed./n", image_file);

exit(1);

    }

if (image.read(image.get_ysize ()) < 0){//读取bmp文件

printf("Read of image %s error/n", image_file);

exit(1);

}

invert_image(&image);//反转图像的每个像素,即使1变0,0变1

int bytes_per_line = check_legal_image_size(image.get_xsize(),

                                                image.get_ysize(),

                                                image.get_bpp());//计算每一行像素所占字节数

    api.SetImage(image.get_buffer(), image.get_xsize(), image.get_ysize(),

                  image.get_bpp() / 8, bytes_per_line);//设置图像

gettimeofday(&beg,NULL);

char* text = api.GetUTF8Text();//识别图像中的文字

gettimeofday(&end,NULL);

printf("%s:reconize sec=%f/n",argv[0],end.tv_sec-beg.tv_sec+(double)(end.tv_usec-beg.tv_usec)/1000000.0);//打印识别的时间

text_out += text;

delete [] text;

FILE* fout = fopen(txt_file, "w");

fwrite(text_out.string(), 1, text_out.length(), fout);//将识别结果写入输出文件

fclose(fout);

}

再编写一个makefile文件如下:

 

all:ocr

CFLAGS=-Wall -g

LDFLAGS= -lz  -lm  -ltesseract_textord /

-ltesseract_wordrec -ltesseract_classify -ltesseract_dict -ltesseract_ccstruct/

-ltesseract_ccstruct -ltesseract_cutil -ltesseract_viewer -ltesseract_ccutil/

-ltesseract_api -ltesseract_image -ltesseract_main -llept

LD_LIBRARY_PATH =

INCLUDES= -I/usr/local/include/tesseract/ -I/usr/local/include/leptonica/

%.o:%.cpp

g++ -c $(CFLAGS) $(INCLUDES)  $(SOURCE) -o $@ $<

ocr:ocr.o

g++ -o $@ $^ -g $(LD_LIBRARY_PATH) $(LDFLAGS)

clean:

rm ocr.o

    在该目录下运行make编译成可执行文件ocr,运行./ocr 1.bmp 1.txt就可以将图像1.bmp识别结果写到1.txt了,程序会打印识别的时间。值得注意的是,tesseract中文识别速度很慢,运行几分钟很正常。不知有哪位大虾知道怎么调优?

   更郁闷的是tesseract不支持多线程,不能在同一进程中运行多个实例。

 

其他参考博客:

1、http://blog.csdn.net/zhoushuyan/article/details/5948289

2、http://www.blogjava.net/wangxinsh55/archive/2011/03/22/346787.html

3、http://haiquan.iteye.com/blog/945701

4、http://www.cnblogs.com/brooks-dotnet/archive/2010/10/05/1844203.html

5、http://www.cnblogs.com/physoft/archive/2011/07/15/2107417.html

6、http://hi.baidu.com/kuliuheng/blog/item/aae32d32216a9fcda2cc2ba1.html

7、http://code.google.com/p/leptonica/downloads/list

8、http://tesseract-ocr.repairfaq.org/

9、http://blog.wudilabs.org/entry/f25efc5f/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tesseract-ocr 的相关文章

  • 如何在 Android '/data/data/pkg/files' 目录中创建文件层次结构?

    我尝试在 Android 的 data data pkg files 目录中创建 foo bar txt 这似乎是文档中的矛盾 要写入文件 请使用名称和路径调用 Context openFileOutput http developer a
  • 在TImageViewer中,如何获取用户点击图片的位置?

    在TImageViewer控件中 用户可以缩放或平移图片 我的问题是 当用户点击图片时 如何获取用户在图片上的点击位置 尤其是用户可以对图片进行放大 缩小或平移之后 如何获取对应的图片点击位置呢 As shown below How to
  • 文章中的内联图像和标题 - 使标题的宽度与图像的宽度一致

    这是我的代码 div class image img src image jpg alt Image description p class caption This is the image caption p div 这是我的 CSS
  • PHP将数据写入文件中间而不重写文件的最佳方法是什么

    我正在 php 1GB 中处理大型文本文件 我正在使用 file get contents file txt NULL NULL 100000000 100 要从文件中间获取数据 但如果我想将文件中的数据更改为与原始数据不同的更改 我将不得
  • 如何使用 C# 以低分辨率形式提供高分辨率图像

    尝试使用 300dpi tif 图像在网络上显示 目前 当用户上传图像时 我正在动态创建缩略图 如果创建的页面引用宽度为 500x500px 的高分辨率图像 我可以使用相同的功能即时转换为 gif jpg 吗 将创建的 jpg 的即将分辨率
  • 如何使网页中出现的图标闪烁/闪烁

    几天前我开始研究高级java 我知道太晚了 我被困在使图标 出现在任务栏上 闪烁的特定任务上 这种闪烁应该根据特定条件发生 这意味着可以使用以下方法来实现javascript 我已经搜索了一段时间了 但是有没有办法让图标每隔 1 秒左右出现
  • 动态创建和下载Doc文件

    因此 我尝试动态创建 doc 文件并让用户在单击按钮时下载该文件 这些是我找到的用于下载文件的标头 header Content Description File Transfer header Content Type applicati
  • 对 os.listdir 文件进行排序 Python

    如果已下载数年的数据 这些数据存储在具有以下命名约定的文件中 year day dat 例如 名为 2014 1 dat 的文件包含 2014 年 1 月 1 日的数据 我需要按天排序读取这些数据文件 2014 1 dat 2014 2 d
  • 在 Java 中如何找出哪个对象打开了文件?

    我需要找出答案哪个对象在我的 Java 应用程序中打开了一个文件 这是为了调试 因此欢迎使用工具或实用程序 如果发现哪个对象太具体了 这class也会很有帮助 这可能很棘手 您可以从使用分析器开始 例如VisualVM http visua
  • C++:获取器和设置器?

    我正在尝试编写一些代码来为以下数据的 ID 号 名字 姓氏 期中成绩和期末成绩创建 getter 和 setter 这些数据位于我正在编写的班级的文本文件中 10601 ANDRES HYUN 88 91 94 94 89 84 94 84
  • 是否可以从外部文件运行 openoffice 宏?

    我想从外部文件运行 OpenOffice 宏 喜欢 vlad leo soffice macro home vlad q vbs 并不是真正的答案 只是一个评论 以便提出这个问题 并希望得到答案 这可能与必须显式设置宏的权限有关 例如 编辑
  • 如何在PHP中将图像从内存上传到AWS S3?

    所以我目前有一个使用 AWS S3 上传图像的上传系统 这是代码 Upload image to S3 s3 Aws S3 S3Client factory array key gt mykey secret gt myskey try s
  • 在Python中读取tiff标签

    我正在尝试用 Python 读取 tiff 文件的标签 该文件是 RGB 的uint16每个通道的值 我目前正在使用tifffile import tifffile img tifffile imread file tif 然而 img是一
  • 如何使用 Perl CGI 脚本提供图像?

    我的 Google fu 让我失望了 如何使用 Perl 提供已生成的图像 Example img src getimage pl getimage pl 里有什么 干得好 usr bin perl w my file inner nav
  • PIL.Image.open和tf.image.decode_jpeg返回值的区别

    我使用 PIL Image open 和 tf image decode jpeg 将图像文件解析为数组 但发现PIL Image open 中的像素值与tf image decode jpeg不一样 为什么会出现这种情况 Thanks 代
  • 为 iOS 应用程序加载基于 SVG 的图像资源

    我从 thenounproject 购买了一个图标作为 SVG 图像 然后我使用一个名为的 macOS 程序Gapplin http gapplin wolfrosch com 将此 SVG 导出为 PNG 图像 它显示为 100x100
  • 在 android 中使用 MediaStore.ACTION_IMAGE_CAPTURE 意图捕获图像

    我正在使用 MediaStore ACTION IMAGE CAPTURE 意图捕获图像 它在大多数设备上运行良好 但它无法按预期在某些最新的 Android 设备中正常工作 我的目的是使用相机捕获图像并将其发送到服务器 但不将该图像存储在
  • HTML5 仅拖放图像

    我想做的是 如果所有拖动的文件都是图像 则将其删除 但如果有其他文件扩展名 则不要删除它们 而仅删除图像 这是我的尝试 HTML div div JavaScript var dropzone document getElementById
  • emacs 是否有类似 vims 的 NERDtree 之类的东西

    对于 vim 有一个名为 NERDtree 的文件系统浏览器 https github com scrooloose nerdtree https github com scrooloose nerdtree Emacs 确实存在替代或更好
  • Java-如何将黑白图像加载到二进制中?

    我在 FSE 模式下使用 Java 和 swing 我想将完全黑白图像加载为二进制格式 最好是二维数组 并将其用于基于掩码的每像素碰撞检测 我什至不知道从哪里开始 过去一个小时我一直在研究 但没有找到任何相关的东西 只需将其读入Buffer

随机推荐

  • jupyter报错

    1 打开anaconda jupyter notebook时报错 Traceback most recent call last File E python anaconda Scripts jupyter notebook script
  • 分页存储管理,分段存储管理,段页式存储管理

    概括的挺详细的 然后我加上了纯分页系统和请求式分页系统的基本概念 也对有些部分稍作修改 一 分页存储管理 1 基本概念 页面和物理块 将一个进程的逻辑地址空间划分成若干大小相等的部分 每一部分称为页或页面 页面的大小通常是2的次幂 大约在5
  • 区块链:Solidity值类型(地址Address)

    地址Address 以太坊钱包地址位数验证 以太坊中的地址的长度为20字节 一字节等于8位 一共160位 所以address其实亦可以用uint160来声明 我的以太坊钱包地址为0xDF12793CA392ff748adF013D146f8
  • 可变个数的参数

    1 用数组的方式来 例如 pulic void print String args for int i 0 i
  • Apache POI 4.1.0 发布,Office 文档的 Java API

    Apache POI 4 1 0 发布了 Apache POI 是用 Java 编写的开源跨平台的 Java API 提供 API 给 Java 程式对 Microsoft Office 格式档案读和写的功能 简而言之 你可以使用 Java
  • CSDN高校俱乐部第三届研讨会

    CSDN高校俱乐部第三届研讨会 于2013年6月6日在国家会议中心成功举办 感谢大家从全国各地远道而来参加 本次研讨会邀请了来自全国32所高校俱乐部的指导老师 同学以及优秀巡讲讲师和微软Imagine Cup 2013大赛负责人 会议开始先
  • 【MySQL高级篇笔记-数据库的设计规范(中) 】

    此笔记为尚硅谷MySQL高级篇部分内容 目录 一 为什么要数据库设计 二 范式 1 范式简介 2 范式都包括哪些 3 键和相关属性的概念 4 第一范式 1st NF 5 第二范式 2nd NF 6 第三范式 3rd NF 7 小结 三 反范
  • Flutter内存优化总结

    Flutter内存优化是一个非常复杂的问题 其中涉及多个方面的优化策略 下面将从以下几个方面对Flutter的内存优化进行具体实现的总结 一 减少Widget的创建和销毁 Widget的创建和销毁是Flutter中内存占用最大和最频繁的操作
  • C++学习笔记黑马程序员(有一些自己的思考)

    学习目标 掌握 C 入门知识 C 核心编程 掌握 STL 洛谷算法训练题 学习内容 C 入门知识 一 基本介绍 C 不同于C语言 这是一门面向对象的高级程序设计语言 二 面向对象与面向过程 什么是面向对象 对象又是什么 对象是对客观事物的抽
  • Flink_04_Watermark(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 时间语义 EventTime 在1 12版本中被设置成了默认 是事件
  • 求平方根问题 (C++ 实现)

    下面是用二分法和牛顿迭代法求一个正数的平方根 二分法 这里的题目稍微宽了一点点 包含了整数和小数的情况 这里二分法就不用多说了 如果中间值的平方与目标值在误差范围内 则返回 否则根据大小情况改变左 右区间的端点 include
  • 每日一题:选数

    选数 题目 Daimayuan Online Judge 原本我的思路是 大致题意就是从n个数中选取若干数 使得它们的和mod n等于0 任意选取 无关顺序 是可以跳着选的 也就是对于每一个数 有两种选择 选与不选 于是我想用01背包 但是
  • linux屏保默认图片,分享

    Ubuntu 4 10 Warty Warthog Ubuntu 5 04 Hoary Hedgehog Ubuntu 5 10 Breezy Badger Ubuntu 6 06 Dapper Drake Ubuntu 6 10 Edgy
  • 多个chatgpt模型

    GPT4All 简介 GPT4AllNomic AI Team 从 Alpaca 获得灵感 使用 GPT 3 5 Turbo OpenAI API 收集了大约 800 000 个提示 响应对 创建了 430 000 个助手式提示和生成训练对
  • SQL中in和not in遇到NULL值的查询情况

    首先 大家可以先试着做这道练习题 题目 给定一个表 T id 是树节点的编号 pid 是它父节点的 id 树中每个节点属于以下三种类型之一 叶子 如果这个节点没有任何孩子节点 根 如果这个节点是整棵树的根 即没有父节点 内部节点 如果这个节
  • 最简单的引入Vue看板娘教程

    最简单的引入Vue看板娘教程 一 项目引入 这里使用的是来自Evgo老哥的 vue live2d 使用简单 直接引入就好 具体的可以看老哥的文档 二 简单实现 在你的项目引入 npm install vue live2d 接着在想要引入看板
  • Unity3D关于iTween知识详解和接口总结

    目录 1 简介 2 物体移动方法 3 物体的颜色变化 4 摄像机淡入淡出 5 音频方法 6 Look类方法 7 旋转方法 8 物体大小缩放 9 晃动效果方法 10 值方法 11 外部工具方法 12 iTweenPath 1 简介 iTwee
  • Windows NT Session 概念的原理与应用浅析 [1] 遍历并获取信息

    转载自 http www cnblogs com flier archive 2004 07 19 25709 html 我在上一篇文章 DACL NULL or not NULL 中曾简要地介绍了 Windows 系统中 Session
  • SonarLint 默认扫描规则

    请看原文 原文链接 https blog csdn net jiaomubai article details 116596868 在平时写代码的时候 为了代码规范和减少 bug 的数量 使用 SonarLint 插件进行代码检查无疑是一个
  • tesseract-ocr

    转自 http www cnblogs com zcsor archive 2011 02 21 1959555 html 关于tesseract ocr3的训练和使用 众所周知 这是一个出色的字符识别软件 这个开源项目可以在http co