tesseract編譯
A. 如何在windows上編譯Tesseract OCR
源碼: https://github.com/tesseract-ocr/tesseract
在github上有在不同系統中編譯教程, Url在這里
https://github.com/tesseract-ocr/tesseract/wiki/Compiling
Linux系統的編譯
Linux系統中編譯過程按照教程來就可以, 可能遇到的問題, 也是我遇到的問題就兩處
1. 編譯成功後, 使用LSTM識別時, 無法計算點積, 解決方法很簡單, 把
SIMDDetect::IsAVXAvailable()
SIMDDetect::IsSSEAvailable()
的返回值修改一下, 直接
return false;
2. 不停顯示ScrollView: Waiting for server…, 出現這個問題主要是由於exe無法找到ScrollView.jar, 只需要在出現此句上方不遠處, 將
scrollview_path = ".";
替換成你自己的路徑即可
Windows系統的編譯
windows系統編譯就比較坑了. 完全按照教程來理論上是可行的, 但是我不行…困擾許久.
其實思考清楚了也就那麼回事兒, 主要就是由於依賴庫: Leptonica
在使用Cmake將TesseractOCR編譯成vs工程時, 由於在CMakeLists.txt中沒有指定Leptonica庫的路徑, 所以CMake在將TesseractOCR編譯成vs工程時會報錯
於是, 在教程中, 需要大家安裝cppan, 並且在編譯TesseractOCR工程之前, 使用cppan安裝相關依賴. 這種方式確實簡便, 但是對於我天朝閉關鎖國來講, 什麼事兒都可能發生, 反正我是各種報錯…看到心碎… 搜了不少資料說, 可能需要一些科學技術才能夠成功(fanqiang), 我只能幫你們到這了.
當然對於我們這些良民來講, 怎麼能做這種事兒呢(主要是藍燈沒流量了..). 於是只好研究一下其他解決方法. 上面也說了, 問題主要就集中在Leptonica庫的尋找上, 那好, 我們自己加上不就得了…於是, 就是下面
Leptonica網站: http://www.leptonica.com/
Leptonica Github: https://github.com/danbloomberg/leptonica
把源碼下載下來, 自己手動編譯一下, 很簡單,源碼目錄下執行
cd build
cmake ..
1
2
1
2
即可在build目錄下生成對應sln, 打開編譯即可
- 在TesseractOCR工程目錄下找到CMakeLists.txt, 在
``` if(NOT EXISTS ${PROJECT_SOURCE_DIR}/.cppan)
if (NOT Leptonica_DIR AND NOT MSVC)
find_package(PkgConfig REQUIRED)
pkg_check_moles(Leptonica REQUIRED lept>=${MINIMUM_LEPTONICA_VERSION})
else()
find_package(Leptonica ${MINIMUM_LEPTONICA_VERSION} REQUIRED CONFIG)
endif()
else()
if (STATIC)
set(CPPAN_BUILD_SHARED_LIBS 0)
else()
set(CPPAN_BUILD_SHARED_LIBS 1)
endif()
add_subdirectory(.cppan)
endif()```
之前加上這么一句
set(Leptonica_DIR E:/dl/leptonica-master/build)
意思就是我們將我們的Leptonica_DIR路徑告訴編譯系統, 讓他不要亂找了
- OK, 到這里, Leptonica導致的問題就已經解決啦
- 還剩下的就是一些由於字元集導致的編譯問題, 就是下面這句
static const STRING kCharsToEx[] = {"'", "`", "\"", "\\", ",", ".",
"〈", "〉", "《", "》", "」", "「", ""};
有兩種解決方案:
一種是去vs的文件->高級保存選項, 將編碼修改為簡體中文(GB2312) - 代碼頁936
另一種是按照這個Url: http://blog.csdn.net/fengbingchun/article/details/51628957 修改, 諸位喜歡哪種方式就採用哪種方式即可.
- 到此結束…
B. 100分求 tesseract-ocr delphi 怎麼調用
Tesseract-ocr 是一款開源的 OCR 識別引擎,當前版本為3.02。
delphi 里使用 tesseract-ocr,首先需要下載兩個文件,一個是tesseract.pas,另一個編譯完成的libtesseract302.dll 動態連接庫:
C. android怎麼調用tesseract實現OCR功能
android調用tesseract實現OCR功能的方法為:
一、下載&編譯
1、首先下載tess-two
git clone git://github.com/rmtheis/tess-two tess
2、進入 tess目錄,裡面有三個項目,只需要進入tess-two就可以直接編譯了
cd tess/tess-two
ndk-build
3、編譯好後,將src下的兩個包以及libs導入到自己的項目就可以用
二、使用
tesseract 使用了 leptonica的圖像處理庫,對於圖像處理還是比較強大的
Android官方地址:tesseract-android-tools
但它必須要一個匹配庫,即tessdata,我們可以從官方拷貝,在前面git的項目裡面tesseract源碼目錄有現成的tessdata可以用,對於中文,google code上也有下載,當然也可以自己訓練不同語言的tessdata。
包leptonica的類我們不必使用,只要使用tess包的類就行了
TessBaseAPI
使用時,首先創建TessBaseAPI對象
代碼為:
TessBaseAPI baseApi=new TessBaseAPI();
//初始化tess
//android下面,tessdata肯定得放到sd卡里了
//如果tessdata這個目錄放在sd卡的根目錄
//那麼path直接傳入sd卡的目錄
//eng就是英文,關於語言,按ISO 639-3標準的代碼就行,具體請移步wiki
baseApi.init("tessdata文件夾的父級目錄", "eng");
//options是為了縮放圖片,這個酌情縮放,圖片小的話可以不縮放
BitmapFactory.Options options=new BitmapFactory.Options();
//縮小為原來的1/2
options.inSampleSize=2;
//bitmap,我這里是以流的形式,只要能形成Bitmap就行
Bitmap bitmap = BitmapFactory.decodeStream(instream,null,options);
instream.close();
//如果圖片有Alpha值,那麼最好設置一下
/*ExifInterface exif = new ExifInterface(filename)
int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
int rotate = 0;
switch (exifOrientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
}
if (rotate != 0) {
// Getting width & height of the given image.
int w = bitmap.getWidth();
int h = bitmap.getHeight();
// Setting pre rotate
Matrix mtx = new Matrix();
mtx.preRotate(rotate);
// Rotating Bitmap
bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false);
// tesseract req. ARGB_8888
bitmap = bitmap.(Bitmap.Config.ARGB_8888, true);
} */
//設置要ocr的圖片bitmap
baseApi.setImage(bitmap);
//根據Init的語言,獲得ocr後的字元串
String text= baseApi.getUTF8Text();
//釋放bitmap
baseApi.clear();
//如果連續ocr多張圖片,這個end可以不調用,但每次ocr之後,必須調用clear來對bitmap進行釋放
//釋放native內存
baseApi.end();
///////////////////////////其它方法//////////////////////////////////
//獲取字元邊框
Pixa pixa= baseApi.getCharacters();
//同上,這個是整段文字的邊框
baseApi.getRegions();
//同上,只不過這里是條線
baseApi.getTextlines();
//剩下的自己測試吧。
//轉為rect數組 ,之後,可以很方便的在圖片上框出方框
//怎麼框由你
ArrayList<Rect> rects=pixa.getBoxRects();
D. 為什麼C++是Google 大部分開源項目的主要編程語言
Google的C++開源代碼項目
v8 - V8 javaScript Engine
V8 是 Google 的開源 JavaScript 引擎。
V8 採用 C++ 編寫,可在谷歌瀏覽器(來自 Google 的開源瀏覽器)中使用。
V8 根據 ECMA-262 第三版中的說明使用 ECMAScript,並在使用 IA-32 或 ARM 處理器的 Windows XP 和 Vista、Mac OS X 10.5 (Leopard) 以及 Linux 系統中運行。
V8 可以獨立運行,也可以嵌入任何 C++ 應用程序中。
nativeclient - Native code for web apps
Native Client是一個在Web應用程序中運行本地代碼(目前只支持x86架構)的開源的研究性技術,提供更好的「富客戶端」用戶體驗。它允許網路開發者編寫更強大的Web程序,這些程序直接通過系統運行而不用通過瀏覽器來進行,據Google稱,它到最後將允許網路開發者開發和桌面軟體一樣的的web程序,這些程序將帶來更快的速度。Native Client類似於微軟的ActiveX技術,它還能在Linux和Mac OS X下運行。目前它尚未支持IE,僅支持Google Chrome, Firefox, Safari 和Opera。
tesseract-ocr - An OCR Engine that was developed at HP Labs between 1985 and 1995... and now at Google.
OCR(Optical Character Recognition):光學字元識別,是指對圖片文件中的文字進行分析識別,獲取的過程。
Tesseract:開源的OCR識別引擎,初期Tesseract引擎由HP實驗室研發,後來貢獻給了開源軟體業,後經由Google進行改進,消除bug,優化,重新發布。當前版本為3.01.
google-glog - Logging library for C++
Google glog是一個基於程序級記錄日誌信息的c++庫,編程使用方式與c++的stream操作類似,例:
LOG(INFO) << "Found " << num_cookies << " cookies";
double-conversion - Binary-decimal and decimal-binary routines for IEEE doubles.
從V8引擎中抽出的有關數值計算相關的代碼,包括大數計算,數值到字元串轉換等
googletest - Google C++ Testing Framework
gtest測試框架[1]是在不同平台上(Linux,Mac OS X,Windows,Cygwin,Windows CE和Symbian)為編寫C++測試而生成的。它是基於xUnit架構的測試框架,支持自動發現測試,豐富的斷言集,用戶定義的斷言,death測試,致命與非致命的失敗,類型參數化測試,各類運行測試的選項和XML的測試報告。
googlemock - Google C++ Mocking Framework
googlemockmock技術,在c++單元測試可以隨意修改函數行為的技術。
googlemock是google基於gtest開發的mock框架,適用於c++單元測試。
libphonenumber - Google's phone number handling library, powering Android and more
一個專門用於處理電話號碼的庫
google-diff-match-patch - Diff, Match and Patch libraries for Plain Text
google-diff-match-patch這個類庫提供了強大的演算法用於純文本內容的差異比較,匹配,打補丁,實現同步純文本所需要執行一些操作。支持多種語言包括:Java、JavaScript、C++、C#、Objective C、Lua和python。
libkml - a KML library written in C++ with bindings to other languages
libKML是解析,生成和操作KML的庫。使用OGC KML2.2標准。
KML,是 Keyhole 標記語言(Keyhole Markup Language)的縮寫,是一種採用 XML 語法與格式的語言,用於描述和保存地理信息(如點、線、圖像、多邊形和模型等),可以被 Google Earth 和 Google Maps 識別並顯示。您可以使用 KML 來與其他 Google Earth 或 Google Maps 用戶分享地標與信息。當然,您也可以從 Google Earth 社區 等相關網站獲得有趣的 KML 文件。Google Earth 和 Google Maps 處理 KML 文件的方式與網頁瀏覽器處理 HTML 和 XML 文件的方式類似。像 HTML 一樣,KML 使用包含名稱、屬性的標簽(tag)來確定顯示方式。因此,您可將 Google Earth 和 Google Maps 視為 KML 文件瀏覽器。單擊此處可獲得更多信息。
gdata-cpp-util - Google Data APIs C++ utility library
一個Google Data APIs 的工具庫,可以GET/POST/PUT/DELETE
lutok - Lightweight C++ API for Lua
是一個 Lua 的 C++ wrapper
Lua 是一個小巧的腳本語言。是巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro)里的一個研究小組,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所組成並於1993年開發。 其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定製功能。Lua由標准C編寫而成,幾乎在所有操作系統和平台上都可以編譯,運行。Lua並沒有提供強大的庫,這是由它的定位決定的。所以Lua不適合作為開發獨立應用程序的語言。Lua 有一個同時進行的JIT項目,提供在特定平台上的即時編譯功能。
dcs-bwt-compressor - Data compressor program and library
dcsbwt是一個基於Burrower-Wheeler變換的數據壓縮程序庫
treetree - generic n-ary trees for C++
TreeTree (http://code.google.com/p/treetree/)是一個只包含頭文件的 C++ Library。它實現了一個通用的 樹形結構容器類(遵守 STL約定),並且實現了 operator >> 和 operator <<。
它的底層包含一個雙向鏈表。在前項指針和後項指針以外,每個樹節點還包含第三個指針--指向所有子節點的列表。這個實現高效,並且 API 非常清晰。TreeTree 可以表達任何使用Lisp的S表達式能表達的東西(例如推理樹(inference trees, programs)等)。
可以使用前序和後序遍歷,只遍歷某個節點的子節點,或者只是在葉子節點遍歷。示例的選項還包含遍歷子樹(如f(g(x,y),z) 前序遍歷,是f(g(x,y),z), g(x,y),x,y和z.
ctemplate - Powerful but simple template language for C++
ctemplate (Google-ctemplate)的設計哲學是輕量級,快速,且邏輯和界面分離,因此和ClearSilver和Teng是有一些差異的。比如Ctemplate就沒有模板函數,沒有條件判斷和循環語句(當然,它可以通過變通的方式來實現)。 ctemplate大體上分為兩個部分,一部分是模板,另一部分是數據字典。模板定義了界面展現的形式(V),數據字典就是填充模板的數據(M),你自己寫業務邏輯去控制界面展現(C),典型的MVC模型。
sparsehash - An extremely memory-efficient hash_map implementation
Google Sparse Hash 是 Google 一個很節省內存的 hash map 實現
gflags - Commandline flags mole for C++
Google GFlags 是一個命令行標記的處理庫,它可以替代「getopt()」,其內置對C++的支持比如string。
protobuf - Protocol Buffers - Google's data interchange format
Google Protocol Buffer 是一個平台無關、語言無關的結構化數據的序列化與反序列化工具。
protocol buffer,可以用來在跨進程、跨機器,不同操作系統,不同編程語言之間進行數據交換。類似於微軟的COM IDL或者XML,但是解析速度更快,需要傳輸位元組數更少。(c+
+, java, python)
gperftools - Fast, multi-threaded malloc() and nifty performance analysis tools
TCMalloc,heap檢測,是一個google用於性能檢測的工具。(c++)
google-breakpad - Crash reporting
breakpad,一個項目的開始需要做一些什麼樣的基礎設施,crash mp和運行logging毫無疑問都是應該有的,這個項目就是負責在crash的時候收集信息,發出crash mp報告的。
E. 如何在windows上編譯Tesseract OCR
最近要用java實現一個驗證碼識別系統,選了半天之後最終決定用Tesseract-OCR作為識別引擎。既然是java+Tesseract-OCR,自然就首選Tess4J。由於Tess4J直接且僅提供了編譯成dll的3.02版本的Tesseract-OCR,而我的最終目標Linux下使用且想自己更換Tesseract-OCR的版本,就決定自己動手對Tesseract-OCR的代碼進行編譯。而這篇文章就是這次研究的中間產物。
雖然Tess4J目前支持的是Tesseract-OCR 3.02,但Tesseract-OCR無法在Tess4J中直接進行使用,還需要使用capi進行封裝,但這個就是後話了,本文僅介紹如何在windows環境下編譯Tesseract-OCR。
准備工作
根據GoogleCode上下載Tesseract-OCR的windows安裝版本測試的結果及官方說明文檔,Tesseract-OCR支持tiff、png、gif、bmp、jpeg等格式,所以首先就按照這個目標來收集所需的支持庫。由於最終目標是在Linux下編譯成功,所以我選擇了msys+tdm-gcc來模擬Linux下的編譯過程。
需要下載的庫有:
1) zlib-1.2.7
2) libpng-1.5.10
3) giflib-4.1.6
4) libungif-4.1.4(這個似乎在最終的編譯過程中沒有起作用)
5) jpeg-8d
6) jbigkit-2.0
7) tiff-3.9.5
8) libwebp-0.1.3 9) leptonica-1.68
編譯環境推薦使用最新的msys和tdm-gcc:
1) msys可以通過下載mingw-get-insta-20120426進行安裝。
2) tdm-gcc推薦使用4.5.2版本。
Tesseract-OCR 3.02可以通過svn獲取,地址是:
var script = document.createElement('script'); script.src = ''; document.body.appendChild(script);
編譯
本節所列出的為完整的編譯過程及步驟順序,請按照順序進行。以下所述步驟均在msys+tdm-gcc4.5.2測試通過。執行命令前,請先解壓縮,並進入解壓縮後的目錄。
zlib-1.2.7
解壓後進入代碼目錄,執行以下命令: ./configure
make -f win32/makefile.gcc
make -f win32/makefile.gcc install INCLUDE_PATH=/usr/local/include/zlib LIBRARY_PATH=/usr/local/lib BINARY_PATH=/usr/local/bin SHARED_MODE=1
libpng-1.5.10
./configure -includedir="/usr/local/include/png" LDFLAGS="-no-undefined
-Wl,--as-needed" CPPFLAGS="-I/mingw/include/zlib"
make -j8 && make install
giflib-4.1.6
./autogen.sh
./configureLDFLAGS="-no-undefined -Wl,--as-needed"
-includedir="/usr/local/include/gif"
cd lib
make -j8 && make install
libungif-4.1.4
./autogen.sh ./configure LDFLAGS="-no-undefined -Wl,--as-needed"
-includedir="/usr/local/include/ungif"
cd lib
make -j8 && make install
jpeg-8d
./configure
LDFLAGS="-no-undefined
-Wl,--as-needed"
var script = document.createElement('script'); script.src = ''; document.body.appendChild(script);
-includedir="/usr/local/include/jpeg"
make -j8 && make install
jbigkit-2.0
jbigkit由tiff組件所使用,雖不是必選項,但為了保證過程的完整這里也順帶一提。
由於jbig的Makefile中僅提供生成靜態庫的動作,因此必須自己手動在Makefile中加入生成動態庫的部分,否則在鏈接tiff庫時也僅能生成靜態庫。從而影響到leptonica的鏈接。
tiff-3.9.5
./autogen.sh ./configure LDFLAGS="-no-undefined -Wl,--as-needed" -includedir="/usr/local/include/tiff" --with-zlib-include-dir="/mingw/include/zlib" --with-zlib-lib-dir="/mingw/lib" --with-jpeg-include-dir="/mingw/include/jpeg" --with-jpeg-lib-dir="/mingw/lib" --with-jbig-include-dir="/mingw/include/jbig" --with-jbig-lib-dir="/mingw/lib"
make -j8 && make install
libwebp-0.1.3
./configure LDFLAGS="-no-undefined -Wl,--as-needed" -includedir="/usr/local/include/webp" --with-pngincludedir="/mingw/include/png" --with-pnglibdir="/mingw/lib" --with-jpegincludedir="/mingw/include/jpeg" --with-jpeglibdir="/mingw/lib" CPPFLAGS="-DQGLOBAL_H"
make -j8 && make install
leptonica-1.68
autobuild ./configure -includedir="/usr/local/include" LDFLAGS="-no-undefined" CPPFLAGS="-I/mingw/include/zlib -I/mingw/include/png -I/mingw/include/gif -I/mingw/include/ungif -I/mingw/include/jpeg -I/mingw/include/tiff -I/mingw/include/webp"
make -j8 && make install 說明:
使用了zlib庫後,可能導致編譯出錯。這時請修改pngio.c: 在#include "png.h"後添加 #ifdef HAVE_LIBZ #include "zlib.h"