搞了很多天的tesseract了,其實感覺收獲不是很大,本想看看源代碼的,想弄清楚,方便日后自己修改源碼的,可是。。可是。。可是。。
于是今天就打算把這個軟件移植到Zynq上,在PC上之前就已經成功安裝了tesseract了,并且利用自帶的測試圖片試了下,沒問題。挺容易的。但是移植到ZYnq上面,我就有點心虛了,心虛肯定是有原因的,自己知識準備得不夠,對linux了解的也不多,對交叉編譯的理解等等,庫,頭文 件,configure,make,make install等等都是需要好好了解的,而且還需要對configure的參數設置得有點知識吧。好了,廢話就不說了,我先記錄下自己的移植過程吧。
用tesseract的知道,這個軟件是需要leptonica的支持,這個東西其實也就是另外的一個軟件一樣,它實現了很多圖像處理方面的功能,類似于 OPENCV吧。這個在PC上的安裝很簡單,.confiugre.make ,make install就搞定了,默認的安裝應該是在.usr/local/下面的吧。當然我需要的交叉編譯,產生能夠在Zynq上面能夠使用的庫啊,頭文件什么 的。自然要用到交叉編譯工具,叫什么arm-xilinx-linux-gunbeabi-gcc之類的稱呼,好長。。。不過意思確實很明顯的,說明這個 編譯工具編譯出來的執行環境是xilinx公司的arm相關的產品,對我來說,手里就只有一塊贈送的ZED板子了,不過感覺這塊板子還是不錯的。哈哈。好 多廢話。。說說怎么編譯leptonica吧。。再來點廢話,交叉編譯的理解多掌握一些的好,不然跟著做也沒啥意思,理解了才是萬能的哇。。我這種新手, 對linux不懂得人當然首先學習一些知識賽。。 /7082590,這個博客講的還是可以的,給我提供了參考和一些知識,在此感謝,不然我真不知道怎么下手啊,有沒人指導,自己瞎弄不知道什么時候啊,幸 好有這些網友的無私奉獻。。
第一步:設置相關環境變量:
export PATH=$PATH:(就是那個 arm-xilinx-linux-gnueabi-gcc這個工具的目錄/bin) //指定交叉編譯器的路徑,這個步驟其實早就做過了,開發板到手這個多天了,算得上學習的第一個實驗就是交叉環境的搭建,還記得吧。。
export CC= arm-xilinx-linux-gnueabi-gcc //指定C文件的編譯工具
export CXX=arm-xilinx-linux-gnueabi-g++ //指定c++文件的編譯工具
關于這部分我想說的是我是參考那個博客的,其實這些東西應該是研究configure -help這個東東,看這個配置的參數,我看了下,除了上面提到的兩個以為,還設計到其他的包括一些庫路徑,源文件路徑啊,什么的,其實重要的也就是那幾個吧。然戶就執行
./configure --build=i686-pc-linux-gnu --host=arm-xilinx-linux-gnueabi --target=arm-xilinx-linux-gnueabi CFLAGS=-I/home/gzw/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/ LDFLAGS=-L/home/gzw/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/lib --prefix=/home/gzw/install/leptonica-1.69
這個后面一堆其實都是寫configure的參數,功能嘛,看看help就知道啦。
然后就是make,make install,由于在執行configure的時候我們指定了安裝路徑為/home/gzw/install/leptonica-1.69的,所以安裝的東西就在這個下面了。
到此為止leptonica就安裝好了。
下面接著講tesseract的安裝,跟上面類似了,所以上面的成功了,下面如魚得水啊。。。。。
前面說過tesseract需要用到leoptonica的東東,所以我就把安裝好的/include 和/lib拷貝到交叉工具所在路徑里面去了,然后再configure的時候指定下需要的頭文件,庫路徑啊之類的就可以了。如下:
./autogen.sh
這部分是不可少的哦,因為configure的時候需要那個makefile.in文件,其實文件看看在linux自動生產的能夠makefile的原理就大概知道這些文件時干什么用的了。
./configure --build=i686-pc-linux-gnu --host=arm-xilinx-linux-gnueabi --target=arm-xilinx-linux-gnueabi CFLAGS=-I/home/gzw/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/ LDFLAGS=-L/home/gzw/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/lib --prefix=/home/gzw/install/tesseract-3.01
之后就make ,make make install 安裝成功了,路徑在在指定的 /home/gzw/install/tesseract-3.01下面了在,這個東東應該都是在Zynq需要的東東,才能用的東東。好了先這樣吧。繼續實驗實驗。。
2013.4.2今天本來想把相關庫文件bin文件等拷貝到zynq上面去運行的,不過拷貝的時候說空間不夠,我也不知道什么原 因,在掛載目錄下面也不能執行tesseract命令,以為找不到庫文件,即使我指定了LD_LIBRARY宏還是不得行,于是又嘗試了下把相關的lib 和bin弄到根文件系統里面去,然后做成鏡像文件,替換那個ramdisk8M, 可是根本執行不了。。這咋辦捏。。記錄之。。
/usr/local/share # cp /mnt/tesseract-3.01/bin/* /usr/local/bin/
/usr/local/share # cp /mnt/tesseract-3.01/lib/* /usr/local/lib/
cp: write error: No space left on device
cp: write error: No space left on device
/usr/local/share #
----------------------------------分割線---------------------------------------
我記錄自己所做的東西,已經到了交叉編譯好了leptonica和tesseract了,就等著在板子上運行一下,看對不對了。結果發現把相關的文 件弄到板子上的時候就提示說空間不夠,要說我是個新手呢,說到底還是理解的不夠啊,不過還好小組里面其他人理解了,說是因為根文件系統制作的時候只有8M 的空間,那些庫文件可不小哦,所以放不下賽,于是小組的陽平同學又做了個1G鏡像文件,啟動還是從ramdisk8M這個根文件系統開始,前面都差不多, 在讀取了設備數,正確引導內核執行rcS文件里面的東西的時候,添加了代碼,意思是把掛載那個1G的文件系統,然后切換根目錄,就相當于現在整個運行空間 是1G的空間,不在是那個8M 的空間了。但說為什么不直接一開始就不要那個ramdisk8M,直接只用這個1G的呢,因為我們不知道怎么產生正確U-boot啊!引導的工作都是交給 u-boot的,至于那個boot.bin只不過還包含了PS,PL的配置而已。像書附件光盤的第二個實驗就只提供了 boot.bin,這個沒有多大的參考,因為大家的PS,PL需要不同的配置。以上這些都是陽平做的工作,哈哈
現在空間夠了,首先把SD卡掛載到虛擬機的 /mnt/sdcard/下面:mount -t vboxsf SDCARD /mnt/sdcard
然后把sd卡中的1G的鏡像掛載:mount /mnt/sdcard/disk1G.img /mnt/disk1g
然后把在虛擬上用交叉工具編譯好的,安裝好的相關文件拷貝,其實就是拷貝bin 和lib文件就可以執行了。當然還需要包括 leptonica·的庫文件,才能正確調用相關的圖像處理庫函數。
cp /home/gzw/install/tesseract-3.01/lib/* /mnt/disk1g/usr/local/lib/
cp /home/gzw/install/tesseract-3.01/bin/* /mnt/disk1g/usr/local/bin/
還需要拷貝eng.traineddata 到/mnt/disk1g/usr//local/share/tessdata/
別以為拷貝完這些就夠了,還不夠,在執行的出現錯誤提示說沒找到 libstdc++.so庫什么的,我找了一下這個文件的位置,發現在我們的交叉編譯工具里面arm-xilin-linux-gnueabi/libc /usr/lib 下面,這個文件夾下面的東西在制作根文件系統的時候沒有可拷貝的,所以這里也需要拷貝才行。
在所以得都拷貝完成之后,將SD卡插入到ZED上面,然后啟動成功之后,切換到執行目錄下面/usr/local/bin,然后export LD_LIBRARAY_PATH=/usr/local/bin指定庫文件,export TESSDATA_PREFIX=/usr/local/share/ 指定數據庫文件,其實就是字庫,我實驗用的英文的字庫,需要識別的圖片也是一副全是英文的圖片。
然后執行./tesseract phototest.bmp phototest.txt -l eng,沒有提示錯誤表示成功輸出了,并且在當前目錄下面產生txt文件,就是識別的結果,利用cat可以將文件內容顯示出來,如下:
This is a lot of 12 point text to test the
ocr code and see if it works on all types
of file format.
The quick brown dog jumped over the
lazy fox. The quick brown dog jumped
over the lazy fox. The quick brown dog
jumped over the lazy fox. The quick
brown dog jumped over the lazy fox.
原圖片就是上面這些英文的圖片。
說明:在執行程序的時候很多時候提示我找不到相關的圖像處理的函數,這些函數 應該需要一些圖像處理的庫,我只拷貝了leptonica庫和tesseract的庫,以及tesseract的bin,最后發現只能識別處理bmp圖 像。需要處理其他圖像只需要把那些圖像處理庫拷貝應該就可以了,雖然說leptonica應該就包含了很多的圖像處理,應該是夠用的,結果發現不夠。呵呵 呵額呵呵。
一下就只執行的輸出的,mark一下。。。。
[ 0.800000] xusbps-ehci xusbps-ehci.0: irq 53, io mem 0x00000000
[ 0.830000] xusbps-ehci xusbps-ehci.0: USB 2.0 started, EHCI 1.00
[ 0.830000] hub 1-0:1.0: USB hub found
[ 0.830000] hub 1-0:1.0: 1 port detected
[ 0.840000] Initializing USB Mass Storage driver...
[ 0.840000] usbcore: registered new interface driver usb-storage
[ 0.850000] USB Mass Storage support registered.
[ 0.850000] Xilinx PS USB Device Controller driver (Apr 01, 2011)
[ 0.860000] mousedev: PS/2 mouse device common for all mice
[ 0.860000] Linux video capture interface: v2.00
[ 0.870000] gspca_main: v2.14.0 registered
[ 0.870000] usbcore: registered new interface driver uvcvideo
[ 0.870000] USB Video Class driver (1.1.1)
[ 0.880000] WDT OF probe
[ 0.880000] xwdtps f8005000.swdt: Xilinx Watchdog Timer at 0xe081c000 with ti
meout 10 seconds
[ 0.890000] sdhci: Secure Digital Host Controller Interface driver
[ 0.890000] sdhci: Copyright(c) Pierre Ossman
[ 0.900000] sdhci-pltfm: SDHCI platform and OF driver helper
[ 0.900000] mmc0: Invalid maximum block size, assuming 512 bytes
[ 0.910000] mmc0: SDHCI controller on e0100000.sdhci [e0100000.sdhci] using A
DMA
[ 0.910000] usbcore: registered new interface driver usbhid
[ 0.920000] usbhid: USB HID core driver
[ 0.920000] No connectors reported connected with modes
[ 0.930000] adv7511 0-0039: Failed to add route DAI IN->TMDS
[ 0.940000] [drm] Cannot find any crtc or sizes - going 1024x768
[ 0.940000] drivers/gpu/drm/analog/analog_drm_fbdev.c:analog_drm_fbdev_probe[
241]
[ 0.960000] asoc: adv7511 <-> 75c00000.axi-spdif-tx mapping ok
[ 0.970000] axi-spdif 75c00000.axi-spdif-tx: Failed to set DAI format: -22
[ 0.970000] Console: switching to colour frame buffer device 128x48
[ 0.980000] ALSA device list:
[ 0.980000] #0: HDMI monitor
[ 0.980000] TCP cubic registered
[ 0.980000] NET: Registered protocol family 17
[ 0.980000] VFP support v0.3: implementor 41 architecture 3 part 30 variant 9
rev 4
[ 0.980000] Registering SWP/SWPB emulation handler
[ 0.980000] registered taskstats version 1
[ 0.980000] drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
[ 1.000000] mmc0: new high speed SDHC card at address b368
[ 1.000000] mmcblk0: mmc0:b368 F0F0F 3.71 GiB
[ 1.030000] mmcblk0: p1
[ 1.030000] fb0: frame buffer device
[ 1.030000] drm: registered panic notifier
[ 1.030000] [drm] Initialized analog_drm 1.0.0 20110530 on minor 0
[ 1.050000] RAMDISK: gzip image found at block 0
[ 1.480000] EXT4-fs (ram0): warning: mounting unchecked fs, running e2fsck is
recommended
[ 1.490000] EXT4-fs (ram0): mounted filesystem without journal. Opts: (null)
[ 1.500000] VFS: Mounted root (ext4 filesystem) on device 1:0.
[ 1.500000] Freeing init memory: 152K
Starting rcS...
++ Mounting filesystem (0)
++ Setting up mdev (0)
++ Changing root filesystem
[ 1.830000] EXT4-fs (loop0): mounting ext2 file system using the ext4 subsyst
em
[ 1.850000] EXT4-fs (loop0): warning: mounting unchecked fs, running e2fsck i
s recommended
[ 1.850000] EXT4-fs (loop0): mounted filesystem without journal. Opts: (null)
++ Mounting filesystem (1)
++ Setting up mdev (1)
++ Starting telnet daemon
++ Starting http daemon
++ Starting ftp daemon
++ Starting dropbear (ssh) daemon
/bin/sh: can't access tty; job control turned off
/ # export LD_LIBRARY_PATH=/usr/local/lib
/ # export TESSDATA_PREFIX=/usr/local/share/
/ # cd /usr/local/bin
/usr/local/bin # ls
1.out.txt phototest.GIF tesseract
cntraining phototest.JPG unicharset_extractor
combine_tessdata phototest.PNG wordlist2dawg
eng.traineddata phototest.bmp
mftraining phototest.tif
/usr/local/bin # ./tesseract phototest.bmp phototest.txt -l eng
Tesseract Open Source OCR Engine v3.01 with Leptonica
/usr/local/bin # cat phototest.txt
cat: can't open 'phototest.txt': No such file or directory
/usr/local/bin # ls
1.out.txt phototest.GIF phototest.txt.txt
cntraining phototest.JPG tesseract
combine_tessdata phototest.PNG unicharset_extractor
eng.traineddata phototest.bmp wordlist2dawg
mftraining phototest.tif
/usr/local/bin # cat phototest.txt.txt
This is a lot of 12 point text to test the
ocr code and see if it works on all types
of file format.
The quick brown dog jumped over the
lazy fox. The quick brown dog jumped
over the lazy fox. The quick brown dog
jumped over the lazy fox. The quick
brown dog jumped over the lazy fox.
評論