交叉移植tesseract過程記述以及總結(在mini2440開發板上運行成功)

背景: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庫文件,如果日後有需要的話就另外加上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章