搞了很多天的tesseract了,其實(shí)感覺收獲不是很大,本想看看源代碼的,想弄清楚,方便日后自己修改源碼的,可是。??墒恰?。可是。。
于是今天就打算把這個(gè)軟件移植到Zynq上,在PC上之前就已經(jīng)成功安裝了tesseract了,并且利用自帶的測試圖片試了下,沒問題。挺容易的。但是移植到ZYnq上面,我就有點(diǎn)心虛了,心虛肯定是有原因的,自己知識準(zhǔn)備得不夠,對linux了解的也不多,對交叉編譯的理解等等,庫,頭文 件,configure,make,make install等等都是需要好好了解的,而且還需要對configure的參數(shù)設(shè)置得有點(diǎn)知識吧。好了,廢話就不說了,我先記錄下自己的移植過程吧。
用tesseract的知道,這個(gè)軟件是需要leptonica的支持,這個(gè)東西其實(shí)也就是另外的一個(gè)軟件一樣,它實(shí)現(xiàn)了很多圖像處理方面的功能,類似于 OPENCV吧。這個(gè)在PC上的安裝很簡單,.confiugre.make ,make install就搞定了,默認(rèn)的安裝應(yīng)該是在.usr/local/下面的吧。當(dāng)然我需要的交叉編譯,產(chǎn)生能夠在Zynq上面能夠使用的庫啊,頭文件什么 的。自然要用到交叉編譯工具,叫什么arm-xilinx-linux-gunbeabi-gcc之類的稱呼,好長。。。不過意思確實(shí)很明顯的,說明這個(gè) 編譯工具編譯出來的執(zhí)行環(huán)境是xilinx公司的arm相關(guān)的產(chǎn)品,對我來說,手里就只有一塊贈送的ZED板子了,不過感覺這塊板子還是不錯的。哈哈。好 多廢話。。說說怎么編譯leptonica吧。。再來點(diǎn)廢話,交叉編譯的理解多掌握一些的好,不然跟著做也沒啥意思,理解了才是萬能的哇。。我這種新手, 對linux不懂得人當(dāng)然首先學(xué)習(xí)一些知識賽。。 /7082590,這個(gè)博客講的還是可以的,給我提供了參考和一些知識,在此感謝,不然我真不知道怎么下手啊,有沒人指導(dǎo),自己瞎弄不知道什么時(shí)候啊,幸 好有這些網(wǎng)友的無私奉獻(xiàn)。。
第一步:設(shè)置相關(guān)環(huán)境變量:
export PATH=$PATH:(就是那個(gè) arm-xilinx-linux-gnueabi-gcc這個(gè)工具的目錄/bin) //指定交叉編譯器的路徑,這個(gè)步驟其實(shí)早就做過了,開發(fā)板到手這個(gè)多天了,算得上學(xué)習(xí)的第一個(gè)實(shí)驗(yàn)就是交叉環(huán)境的搭建,還記得吧。。
export CC= arm-xilinx-linux-gnueabi-gcc //指定C文件的編譯工具
export CXX=arm-xilinx-linux-gnueabi-g++ //指定c++文件的編譯工具
關(guān)于這部分我想說的是我是參考那個(gè)博客的,其實(shí)這些東西應(yīng)該是研究configure -help這個(gè)東東,看這個(gè)配置的參數(shù),我看了下,除了上面提到的兩個(gè)以為,還設(shè)計(jì)到其他的包括一些庫路徑,源文件路徑啊,什么的,其實(shí)重要的也就是那幾個(gè)吧。然戶就執(zhí)行
./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
這個(gè)后面一堆其實(shí)都是寫configure的參數(shù),功能嘛,看看help就知道啦。
然后就是make,make install,由于在執(zhí)行configure的時(shí)候我們指定了安裝路徑為/home/gzw/install/leptonica-1.69的,所以安裝的東西就在這個(gè)下面了。
到此為止leptonica就安裝好了。
下面接著講tesseract的安裝,跟上面類似了,所以上面的成功了,下面如魚得水啊。。。。。
前面說過tesseract需要用到leoptonica的東東,所以我就把安裝好的/include 和/lib拷貝到交叉工具所在路徑里面去了,然后再configure的時(shí)候指定下需要的頭文件,庫路徑啊之類的就可以了。如下:
./autogen.sh
這部分是不可少的哦,因?yàn)閏onfigure的時(shí)候需要那個(gè)makefile.in文件,其實(shí)文件看看在linux自動生產(chǎn)的能夠makefile的原理就大概知道這些文件時(shí)干什么用的了。
./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下面了在,這個(gè)東東應(yīng)該都是在Zynq需要的東東,才能用的東東。好了先這樣吧。繼續(xù)實(shí)驗(yàn)實(shí)驗(yàn)。。
2013.4.2今天本來想把相關(guān)庫文件bin文件等拷貝到zynq上面去運(yùn)行的,不過拷貝的時(shí)候說空間不夠,我也不知道什么原 因,在掛載目錄下面也不能執(zhí)行tesseract命令,以為找不到庫文件,即使我指定了LD_LIBRARY宏還是不得行,于是又嘗試了下把相關(guān)的lib 和bin弄到根文件系統(tǒng)里面去,然后做成鏡像文件,替換那個(gè)ramdisk8M, 可是根本執(zhí)行不了。。這咋辦捏。。記錄之。。
/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 #
----------------------------------分割線---------------------------------------
我記錄自己所做的東西,已經(jīng)到了交叉編譯好了leptonica和tesseract了,就等著在板子上運(yùn)行一下,看對不對了。結(jié)果發(fā)現(xiàn)把相關(guān)的文 件弄到板子上的時(shí)候就提示說空間不夠,要說我是個(gè)新手呢,說到底還是理解的不夠啊,不過還好小組里面其他人理解了,說是因?yàn)楦募到y(tǒng)制作的時(shí)候只有8M 的空間,那些庫文件可不小哦,所以放不下賽,于是小組的陽平同學(xué)又做了個(gè)1G鏡像文件,啟動還是從ramdisk8M這個(gè)根文件系統(tǒng)開始,前面都差不多, 在讀取了設(shè)備數(shù),正確引導(dǎo)內(nèi)核執(zhí)行rcS文件里面的東西的時(shí)候,添加了代碼,意思是把掛載那個(gè)1G的文件系統(tǒng),然后切換根目錄,就相當(dāng)于現(xiàn)在整個(gè)運(yùn)行空間 是1G的空間,不在是那個(gè)8M 的空間了。但說為什么不直接一開始就不要那個(gè)ramdisk8M,直接只用這個(gè)1G的呢,因?yàn)槲覀儾恢涝趺串a(chǎn)生正確U-boot??!引導(dǎo)的工作都是交給 u-boot的,至于那個(gè)boot.bin只不過還包含了PS,PL的配置而已。像書附件光盤的第二個(gè)實(shí)驗(yàn)就只提供了 boot.bin,這個(gè)沒有多大的參考,因?yàn)榇蠹业腜S,PL需要不同的配置。以上這些都是陽平做的工作,哈哈
現(xiàn)在空間夠了,首先把SD卡掛載到虛擬機(jī)的 /mnt/sdcard/下面:mount -t vboxsf SDCARD /mnt/sdcard
然后把sd卡中的1G的鏡像掛載:mount /mnt/sdcard/disk1G.img /mnt/disk1g
然后把在虛擬上用交叉工具編譯好的,安裝好的相關(guān)文件拷貝,其實(shí)就是拷貝bin 和lib文件就可以執(zhí)行了。當(dāng)然還需要包括 leptonica·的庫文件,才能正確調(diào)用相關(guān)的圖像處理庫函數(shù)。
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/
別以為拷貝完這些就夠了,還不夠,在執(zhí)行的出現(xiàn)錯誤提示說沒找到 libstdc++.so庫什么的,我找了一下這個(gè)文件的位置,發(fā)現(xiàn)在我們的交叉編譯工具里面arm-xilin-linux-gnueabi/libc /usr/lib 下面,這個(gè)文件夾下面的東西在制作根文件系統(tǒng)的時(shí)候沒有可拷貝的,所以這里也需要拷貝才行。
在所以得都拷貝完成之后,將SD卡插入到ZED上面,然后啟動成功之后,切換到執(zhí)行目錄下面/usr/local/bin,然后export LD_LIBRARAY_PATH=/usr/local/bin指定庫文件,export TESSDATA_PREFIX=/usr/local/share/ 指定數(shù)據(jù)庫文件,其實(shí)就是字庫,我實(shí)驗(yàn)用的英文的字庫,需要識別的圖片也是一副全是英文的圖片。
然后執(zhí)行./tesseract phototest.bmp phototest.txt -l eng,沒有提示錯誤表示成功輸出了,并且在當(dāng)前目錄下面產(chǎn)生txt文件,就是識別的結(jié)果,利用cat可以將文件內(nèi)容顯示出來,如下:
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.
原圖片就是上面這些英文的圖片。
說明:在執(zhí)行程序的時(shí)候很多時(shí)候提示我找不到相關(guān)的圖像處理的函數(shù),這些函數(shù) 應(yīng)該需要一些圖像處理的庫,我只拷貝了leptonica庫和tesseract的庫,以及tesseract的bin,最后發(fā)現(xiàn)只能識別處理bmp圖 像。需要處理其他圖像只需要把那些圖像處理庫拷貝應(yīng)該就可以了,雖然說leptonica應(yīng)該就包含了很多的圖像處理,應(yīng)該是夠用的,結(jié)果發(fā)現(xiàn)不夠。呵呵 呵額呵呵。
一下就只執(zhí)行的輸出的,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.
評論
查看更多