最近开始学习Tesseract-ocr。Google在GitHub上提供了Tesseract的源码以及现成的语言训练包。然而最新版本的Tesseract 4.0需要VS2015及以上版本的支持, 而提供的语言训练包只支持4.00和3.04两个版本的Tesseract。由于工作需要, 不能安装VS2015, 因此为了能直接使用官方提供的训练包,我选择在VS2013上编译Tesseract 3.04版本。
然而, 故事不可能就这么简单。 在这个安装和编译过程中我踩了很多的坑, 折腾了一整天才将它成功编译。这是我第一次在简书写文, 事实上我之前也没有任何写博文的经验, 所以此文可能会有许多的问题和不足,还请各位多多批评指正。其实这是一篇我用来练手Markdown的文章
这一步我就不再多说了。 最简单的办法就是打开软件管家, 搜索Git, 然后安装即可。
为什么不直接下载源文件然后编译呢? 当然是因为编译不过呀喂!这是我踩的第一个坑。为了避免麻烦, 我们直接先下载好依赖文件。
依赖文件的GitHub地址在这里 。 这里我们可以选择手动下载,但既然我们使用了Git, 所以还是用Git来下载吧。
首先在你想要的位置新建一个目录用来存放文件。 我选择的位置是F:\tesseract-build。
接着打开命令行, 切换到tesseract-build文件夹下, 执行下面的指令:
git clone https://github.com/charlesw/tesseract-vs2012.git
clone完成后, 在tesseract-build会出现名为tesseract-vs2012
的文件夹。进入文件夹, 打开tesseract.sln
工程文件, 编译运行……
别急,先深吸一口气。因为接下来你可能会遇到一系列的问题。 没关系, 我会一一列出并给出解决办法。
首先你可能会看到这个错误:
这个问题是VS2013的兼容性造成的。 解决方法:右击解决方案资源管理器中的liblept-171
, 进行如下设置:
1. “C/C++” --> "常规” -->”调试信息格式” 设置为 “C7 兼容(/Z7)”`
2. “C/C++” --> "代码生成” -->”启用字符串池” 设置为 “是(/GF)”`
3. “链接器” --> "调试” -->”生成调试信息” 设置为 “是(/DEBUG)”`
然后再编译, 出现了新的错误:
这个是由于文件编码的原因造成的。 解决办法:
1. 点击“文件” --> “高级保存选项”
2. 将编码改为`Unicode(UTF-8 带签名) - 代码页 65001` (提示: 在选项的最开始的地方)
继续编译, 发现出现出现下面的错误:
以及
解决办法:
跳到问题所在的行, 将声明变量的类型由l_unit32
改为int
继续编译, 已经没有没有报错了, 但弹出了这个警告框:
不要慌。 到了这一步,你与这个工程的战斗已经结束了。 你可以选择点击确定, 关掉工程, 进入后续步骤。
接下来, 找到你的VS2013安装目录, 进入下面的文件夹:
打开VS2013 开发人员命令提示
, 切换到tesseract-vs2012
所在的文件夹, 执行下面的指令
msbuild build.proj
然后就会开始编译过程。 经过两到三分钟的编译后, 看到这个提示:
说明你成功了。关掉命令行, 进入tesseract-build\tesseract-vs2012目录, 如果你细心的话会发现里面多出了一个release文件夹。 点进入里面有include
和lib
两个文件夹。 我们辛苦了这么久, 就是为了它们。接下来你需要:
1. 进入tesseract-build\tesseract-vs2012, 将vs2013+64bit_support.patch文件复制到tesseract-build目录下
2. 进入tesseract-build\tesseract-vs2012\release, 将include文件夹和lib文件夹复制到tesseract-build目录下
3. 将tesseract-build\lib\Win32里的内容全部拷贝到tesseract-build\lib下
这时你的tesseract-build目录中应该有下面这些东西:
辛苦了这么久, 终于开始下载源码了。这一步就不要手动下载了, 因为等下需要用到git仓库。打开命令行, 切换到tesseract-build文件夹, 输入下面的指令:
git clone https://github.com/tesseract-ocr/tesseract.git
克隆完毕后你的tesseract-build文件夹下会多出一个tesseract文件夹, 这正是Tesseact的源码。
然而实际上, 我们克隆下来的是Tesseract 4.0的源码, 而我们需要的是3.04, 所以需要用checkout指令进行版本切换。右键点击tesseract文件夹,运行git bash。 在弹出的git命令行中输入:
git checkout -b 3.04-vs2013 3.04.00
之后你会发现, tesseract文件夹的内容已经与之前不一样了, 说明我们已经将版本切换到了3.04
继续在命令行中输入
git am --signoff < ../vs2013+64bit_support.patch
这句话是将tesseract-build目录下的vs2013+64bit_support.patch补丁打到tesseract工程内。但这时你会发现又出错了:
git需要知道你是谁。 解决这个问题你需要进入tesseract\git
文件夹(这个文件夹默认是隐藏的, 所以你可能需要先显示隐藏文件),修改config
文件, 在最下面写上这些内容;
[user]
email = [email protected]
name = xxx
这里写你的GitHub邮箱跟用户名。 注意不要乱填。
填完之后保存, 再执行一次之前的指令, 补丁就可以顺利打上了。
到了这一步, 你离成功已经近在咫尺了。 打开tesseract文件夹, 里面会比之前多出一个vs2013文件夹。 进入文件夹, 打开tesseract.sln
工程文件。进入之后不要着急, 先将tesseract设为启动项, 然后进行编译。
编译过程如果出现下面的警告:
解决办法:找到tesseract
中的equationdetect.cpp
文件,将代码中的:
static const STRING kCharsToEx[] = {"'", "`", "\"", "\\", ",", ".",
"〈", "〉", "《", "》", "」", "「", ""};
改为
static const STRING kCharsToEx[] = { "'", "`", "\"", "\\", ",", ".",
"<", ">", "<<", ">>", "" };
再次编译。 在编译完成后会弹出这样的提示框:
这个liblept171d.dll
在哪呢?在tesseract-build\lib
文件夹中。 为了让项目能找到这个文件, 我们把tesseract-build\lib添加到环境变量PATH中。再次编译,成功。然后把调试器切换到DLL_Release, 再次编译, 依然成功!现在你可以在tesseract-build\tesseract\vs2013\bin\Win32\DLL_Debug
以及tesseract-build\tesseract\vs2013\bin\Win32\DLL_Release
两个文件夹中分别找到对应的exe文件。 它们就是我们的Tesseract执行文件。 也就是说, 源码终于编译成功了!
至此, 整个编译过程就结束了。 一个简单的编译就花费了我这么多的功夫, 我的Tesseract的学习之路还很漫长……