交叉移植tesseract过程记述以及总结(在mini2440开发板上运行成功)

2019-07-13 01:12发布

背景:tesseract是一个非常有名的图像字符识别软件,但是基于网上交叉编译和移植到ARM平台上运行成功的例子比较少,所以我抛砖引玉,希望能对大家有所帮助。 交叉移植tesseract过程记述以及总结 一:tesseract软件简述       tesseract-ocr是一个比较有名的开源图像识别软件,最早是由惠普(HP)公司创造,但是被惠普束之高阁十年之后,HP公司终于良心发现,于是在2006年将其贡献给开源社区,目前由google公司在维护,有了如此强大的后盾,我相信tesseract的明天会更加美好。   开源项目地址:http://code.google.com/p/tesseract-ocr/

下载地址:
http://code.google.com/p/tesseract-ocr/downloads/list

安装说明:
http://code.google.com/p/tesseract-ocr/wiki/ReadMe

我下的是目前最新版的tesseract-3.00.tar.gz,在开始交叉编译之前先要搞清楚其依赖:

1.
依赖:
基本依赖:libpng, libjpeg, zlib……(各种图片格式,如果有了leptonica库文件的支持,这部分暂时可以不去理会)

严重依赖:libtiffleptonica(如果不安装的话,tesseract不支持识别压缩的tif图像)


  二:所需软件资源: 图像字符识别软件(OCR):tesseract3.0—目前最新版,支持六种语言,完美支持中文识别。   图像集合:leptonica-1.68—关于这个软件具体还不是很清楚,但是如果没有这个的话,tesseract3.0仅仅支持.tif图片格式的转换(要先加载上libtiff.*相关的库文件)。当tesseract3.0有了leptonica库文件的支持,可以转化多种图片格式,例如jpgpngbnp等格式。   libtiff4-dev:libtiff库文件的支持,由于我们的项目没有要求去识别tiff格式的图片,所以没有将其加进去,不过之前在实验的时候有加进去过,实验是成功的。不过如果需要libtiff库文件支持,在安装tesseract的时候注意要加上libtiff的路径--with-libtiff=[pathtolibtifflib]     三:交叉编译移植过程: PC机上的移植就不再细述,下面主要讲解如何进行交叉编译有库依赖的软件资源。   1:首先要明确几个概念和一些LINUX系统知识。 1):交叉编译时候如何配置连接库的搜索路径 
交叉编译的时候不能使用本地(i686机器,即PC机器,研发机器)机器上的库,但是在做编译链接的时候默认的是使用本地库,即/usr/lib,/lib两个目录。因此,在交叉编译的时候,要采取一些方法使得在编译链接的时候找到需要的库。
 
首先,要知道:
编译的时候只需要头文档,真正实际的库文档在链接的时候用到。 (这是我的理解,假如有不对的地方,敬请网上各位大侠指教) 然后,讲讲如何在交叉编译链接的时候找到需要的库。

1)、交叉编译时候直接使用-L-I参数指定搜索非标准的库文档和头文档的路径。例如:
arm-linux-gcc test.c -L/usr/local/arm/2.95.3/arm-linux/lib -I/usr/local/arm/2.95.3/arm-linux/include 
2)、使用ld.so.conf文档,将用到的库所在文档目录添加到此文档中,然后使用ldconfig命令刷新缓存。 
3)、使用如下命令:

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/arm/2.95.3/arm-linux-lib 
参见《ld.so.conf 文档和PKG_CONFIG_PATH变量》这篇文章。 
通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(!)。
 
通过设定环境变量LD_LIBRARY_PATH也可以指定动态库搜索路径。当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号""分隔。
 
不过LD_LIBRARY_PATH的设定作用是全局的,过多的使用可能会影响到其他应用程序的运行,所以多用在调试。(LD_LIBRARY_PATH 的缺陷和使用准则,可以参考《Why LD_LIBRARY_PATH is bad )。通常情况下推荐还是使用gcc-R-rpath选项来在编译时就指定库的查找路径,并且该库的路径信息保存在可执行文件中,运行时它会直接到该路 径查找库,避免了使用LD_LIBRARY_PATH环境变量查找。
  2.1. 静态库和动态库的基本概念
静态库,是在可执行程序连接时就已经加入到执行码中,在物理上成为执行程序的一部分;使用静态库编译的程序运行时无需该库文件支持,哪里都可以用,但是生 成的可执行文件较大。动态库,是在可执行程序启动时加载到执行程序中,可以被多个可执行程序共享使用。使用动态库编译生成的程序相对较小,但运行时需要库 文件支持,如果机器里没有这些库文件就不能运行。
2 如何使用动态库
如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置。linux的可执行程序在执行的时候默认是先搜索/lib/usr/lib 两个目录,然后按照/etc/ld.so.conf里面的配置搜索绝对路径。同时,Linux也提供了环境变量LD_LIBRARY_PATH供用户选择 使用,用户可以通过设定它来查找除默认路径之外的其他路径,如查找/work/lib路径,你可以在/etc/rc.d/rc.local或其他系统启动 后即可执行到的脚本添加如下语句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)。并且LD_LIBRARY_PATH路径优先于系统默认路径之前查找(详细参考《使用 LD_LIBRARY_PATH》)。
不过LD_LIBRARY_PATH的设定作用是全局的,过多的使用可能会影响到其他应用程序的运行,所以多用在调试。(LD_LIBRARY_PATH 的缺陷和使用准则,可以参考《Why LD_LIBRARY_PATH is bad)。通常情况下推荐还是使用gcc-R-rpath选项来在编译时就指定库的查找路径,并且该库的路径信息保存在可执行文件中,运行时它会直接到该路 径查找库,避免了使用LD_LIBRARY_PATH环境变量查找。
3.库的链接时路径和运行时路径
现代连接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开,用户可以通过-L指定连接时库的路径,通过-R(或-rpath)指定程序运行时库的路径,大大提高了库应用的灵活性。比如我们做嵌入式 移植时#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/ -llibz-1.2.3 (work/lib/zlib下是交叉编译好的zlib),将target编译好后我们只要把zlib库拷贝到开发板的系统默认路径下即可。或者通过 -rpath(或-R )、LD_LIBRARY_PATH指定查找路径。     2:有了上面的一些知识后,那么就正式开始交叉编译与移植: 1):首先交叉编译leptonica-1.68.tar.gz,为什么要先编译这个库文件先呢?因为在编译tesseract的时候需要依赖它的库文件和头文件。 A:    tar  zxvf  leptonica-1.68.tar.gz b:    cd  leptonica c:     接下来是配置交叉编译的路径,因为在PC机上是默认用gcc编译器进行编译的       export  PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin   //指定交叉编译器的路径,我用的交叉编译器是友善之臂arm-linux-gcc-4.4.3          export   CC=arm-linux-gcc   //指定C文件的编译工具          export   CXX=arm-linux-g++  //指定c++文件的编译工具 注意:增加这两行的环境变量的设置,就不用去修改每一个的MAKEFILE文件 d:  交叉编译使用configure参数,建议在使用之前先用命令configure –help查看一下每个参数的作用    ./configure  --build=i686-linux  --host=arm-linux  --target=arm-linux  CFLAGS=-I/opt/FriendlyARM/toolschain/4.4.3/include LDFLAGS=-L/opt/FriendlyARM/toolschain/4.4.3/lib –prefix=/usr/local/install/leptonica 以下对参数进行说明: --build=i686-linux   :表示在PC平台上编译 --host=arm-linux     :表示平台架构为arm --target=arm-linux  :目标平台为arm CFLAGS参数是指定编译时的头文件 LDFLAGS参数是指定编译时的库文件 --prefix:指定安装路径   (建议熟悉configure的里面的每一个参数,因为这样在移植过程中会事半功倍)   e:    make f  make install   2):交叉编译通过之后,在指定的安装路径下会生成/bin  /include  /lib等目录。/lib目录下的文件是需要移植到开发板的。     3:成功交叉编译成功leptonica之后,下面就开始交叉编译tesseract 注意:在交叉编译tesseract之前,应先将之前编译生成的leptonica/include /lib相关文件加到arm-linux-gcc相应的目录下, 如按照我的实际情况,我是将其加在/opt/FriendlyARM/toolschain/4.4.3/inlcudeopt/FriendlyARM/toolschain/4.4.3/lib/这两个目录下。这点非常关键,之前一直搞不懂编译原理,所以浪费了很多时间。你所编译的软件要有所依赖,那么在交叉编译的时候一定要让编译工具链找到所依赖的头文件和库文件,最简单的方法就是直接把所依赖的头文件和库文件直接加在交叉工具链相应的目录下。也可以在./configure的时候,用相应的参数指定库文件和头文件的路径,让工具链可以找到,这种方法需要对./configure的每一个参数比较熟悉。因为交叉编译tesseract的时候需要用到leptonica的库文件和头文件。   Cp /usr/local/install/leptonica/include /opt/FriendlyARM/toolschain/4.4.3/include   Cp  /usr/local/install/leptonica/lib /opt/FriendlyARM/toolschain/4.4.3/lib   (1):下面开始交叉编译tesseract3.0 a:     tar  zxvf tesseract3.0.tar.gz b:     cd  tesseract3.0 c:     export  PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin        export   CC=arm-linux-gcc        export   CXX=arm-linux-g++   d:    ./configure  --build=i686-linux  --host=arm-linux  --target=arm-linux CFLAGS=-I/opt/FriendlyARM/toolschain/4.4.3/include LDFLAGS=-L/opt/FriendlyARM/toolschain/4.4.3/lib   (tesseract的安装路径采用了默认设置,它的库文件会被安装在/usr/local/lib下,而程序文件安装在/usr/local/bin)   e:   make f:   make install     4:  交叉编译成功后,通过网络工具将相关文件下载到开发板运行,在可执行程序放在/usr/local/bin下,将相关库文件放在/usr/local/lib下,将数据库放在/usr/local/share/tessdata/目录下。 在运行前可以通过以下命令指定库的搜索路径: export  LD_LIBRARY_PATH=/usr/local/lib 指定了运行tesseract程序的库搜索路径后,下面就开始执行程序: cd  /usr/local/bin ./tesseract  output.jpg  output  -l eng   执行后可以成功转换jpg图片格式,并且对英文的识别率相当之高,中文的识别暂时无法尝试,因为mini2440的内存不够大,无法运行中文数据库。初步大捷。     5:说明几个问题: 1):我们只需要交叉编译leptonica这个库文件按就可以使tesseract识别多种不同格式的图片,因为他是一个图片集合,我们不需要去另外编译libjpeg或者其它的库文件,因为没有必要,leptonica已经很好兼容了各图片格式。   2):由于目前所做的项目不要去识别tif格式的图片,所以我在编译tesseract的时候并没哟使他支持libtiff库文件,如果日后有需要的话就另外加上。