1. 程式人生 > >[筆記]Win10下編譯Tesseract-OCR 4.0

[筆記]Win10下編譯Tesseract-OCR 4.0

Tesseract-OCR 4.0使用了LSTM網路,準確性相比3.x版本提升不少。
官網提供的安裝包會提供一堆DLL,而我需要的是一個靜態連結的exe檔案,所以只能重新編譯。

編譯環境

  • Windows 10 專業版

  • Visual Studio 2017

需要選擇開發桌面程式的相關元件,並選擇英文。

  • cmake

我的cmake版本是3.13.2,貌似沒它也行。

  • cppan

cppan官網下載CPPAN客戶端,編譯動態庫時使用。

  • vckpg

下載vcpkg原始碼,使用管理員許可權開啟PowerShell,編譯之。

> git clone https://github.com/Microsoft/vcpkg.git
> cd vcpkg

PS> .\bootstrap-vcpkg.bat
PS> .\vcpkg integrate install

編譯Tesseract-OCR 4.0

PS> .\vcpkg install tesseract:x86-windows-static

如果需要64位的exe,將上面的x86換成x64即可。
如果發現某個元件下載失敗,可以自行下載後,將檔案放在vcpkg\downloads\目錄下,然後重新執行上面的命令。
最後成功時,會得到exe檔案在vcpkg\packages\tesseract_x86-windows-static\tools\tesseract\tesseract.exe

驗證exe檔案

PS> .\tesseract.exe --version
tesseract 4.0.0
 leptonica-1.76.0 (Jan  5 2019, 23:01:20) [MSC v.1916 LIB Release x86]
  libgif 5.1.4 : libjpeg 6b (libjpeg-turbo 1.5.3) : libpng 1.6.35 : libtiff 4.0.10 : zlib 1.2.11
 Found AVX
 Found SSE

使用Tesseract-OCR 4.0識別圖片檔案

將tesseract.exe拷貝到某個目錄,然後在該目錄之下建立tessdata目錄,下載所需的語言庫檔案放在裡面。
要識別簡體中文,需要下載的是chi_sim_best.traineddatachi_sim_vert.traineddata檔案。

舉例要識別a.jpg檔案,命令列如下:

> tesseract.exe a.jpg output -l chi_sim_best --oem 1

識別結果在output.txt檔案內。

OpenMP

安裝Visual C++ Redistributable 2015,就有了vcomp140.dll

,以支援OpenMP。

編譯動態庫

如果想得到動態庫,使用下面的命令:

cppan --build pvt.cppan.demo.google.tesseract.tesseract-master

中間出現錯誤,將equationdetect.cpp使用帶BOM的UTF-8編碼另存一下就解決了,最終生成的動態庫檔案如下:

pvt.cppan.demo.danbloomberg.leptonica-1.76.0.dll
pvt.cppan.demo.google.tesseract.libtesseract-master.dll
pvt.cppan.demo.google.tesseract.tesseract-master.exe
pvt.cppan.demo.jpeg-9.2.0.dll
pvt.cppan.demo.madler.zlib-1.2.11.dll
pvt.cppan.demo.openjpeg.openjp2-2.3.0.dll
pvt.cppan.demo.png-1.6.35.dll
pvt.cppan.demo.tiff-4.0.9.dll
pvt.cppan.demo.webp-0.6.1.dll
pvt.cppan.demo.xz_utils.lzma-5.2.4.dll

Tesseract訓練工具

cppan官網下載CPPAN客戶端,然後執行

cppan --build pvt.cppan.demo.google.tesseract-master

最後也沒成功,部分報錯如下:

Performing Test HAVE_DECL_DECL - Failed
...
error C2065: 'decl': undeclared identifier

不清楚原因是什麼。