tesseract是一個基於C++編寫的開源OCR(光學字符識別)庫
本文簡單介紹一下windows系統中編譯和使用tesseract以及調用該庫的C++ api進行開發
環境爲win10+vs2015
源碼下載
tesseract的編譯有諸多依賴,tesseract依賴於leptonica,而leptonica又依賴於png,tiff,jpeg等基礎庫,所以需要下載這些依賴的源碼,並且依次編譯
考慮到某些圖片格式的基礎庫源碼較老並且久未更新難於編譯,本文只編譯了較新的libtiff,並作爲示例,其他圖片格式未測試
下載地址:
- libtiff 4.09,http://download.osgeo.org/libtiff/tiff-4.0.9.zip
- leptonica 1.76.0,http://www.leptonica.com/source/leptonica-1.76.0.tar.gz
- tesseract 3.05.01,https://github.com/tesseract-ocr/tesseract/archive/3.05.01.zip
下載完後解壓縮到文件夾,這裏將三個項目源碼都放在codetest目錄
編譯
特別指定,本文中所有項目生成都是使用cmake-gui工具(首先要會用這個工具),C++編譯使用vs2015,所有cmake編譯目錄都定爲build_x64
所有的編譯模式都是:vs2015 win64 release
由於tiff --> leptonica --> tesseract 三者之間層層遞進,環環相扣,所以編譯一定要注意順序和設置
step1:編譯tiff
常規cmake流程編譯出 tiff.lib和tiff.dll,位置在 D:\codetest\tiff-4.0.9\build_x64\libtiff\Release
step2:編譯leptonica
cmake配置,勾選Grouped和Advanced,會顯示png和tiff等圖片庫的設置入口,要先將tiff的目錄配置進去,使得支持tiff格式
然後需要修改 libtiff目錄下的兩個頭文件,將tiffconf.vc.h和tif_config.vc.h改名爲tiffconf.h和tif_config.h
這樣就能編譯出leptonica的庫文件了
- leptonica-1.76.0.lib,位置 D:\codetest\leptonica-1.76.0\build_x64\src\Release
- leptonica-1.76.0.dll,位置 D:\codetest\leptonica-1.76.0\build_x64\bin\Release
step3:編譯tesseract
根目錄的cmake配置文件在
if(NOT EXISTS ${PROJECT_SOURCE_DIR}/.cppan)
這句話之前加上
set(Leptonica_DIR D:/codetest/leptonica-1.76.0/build_x64)
include_directories(
D:/codetest/leptonica-1.76.0/src
D:/codetest/leptonica-1.76.0/build_x64/src
)
目的是爲了讓tesseract在cmake的config階段找到leptonica的頭文件和庫在configure的過程會出現如下日誌,顯示正在下載ICU的依賴,注意打開vpn,否則會因爲網絡問題不成功
之後,打開sln進行編譯,一般情況下會出現一個字符編碼的報錯
此時不用驚慌,只需要將tesseract中equationdetect.cpp文件修改一下,再編譯就好了
static const STRING kCharsToEx[] = {"'", "`", "\"", "\\", ",", ".",
"〈", "〉", "《", "》", "」", "「", ""};
改爲
static const STRING kCharsToEx[] = { "'", "`", "\"", "\\", ",", ".",
"<", ">", "<<", ">>", "" };
然後順利編譯出tesseract項目的各種二進制工具exe,lib和dll
- tesseract305.lib,位置 D:\codetest\tesseract-3.05.01\build_x64\Release
- tesseract305.dll,位置 D:\codetest\tesseract-3.05.01\build_x64\bin\Release
- tesseract.exe,位置 D:\codetest\tesseract-3.05.01\build_x64\bin\Release
工具使用
在D:\codetest\tesseract-3.05.01\build_x64\bin\Release目錄下,從源碼目錄將tessdata拷貝進去,並且提前下載好已訓練語言包,另外,將用到的tiff和liptonica以及要識別的圖片都拷貝進來
bmp格式原生支持,tif格式此時也是支持的,這裏以tif圖片爲例
在這個目錄輸入命令行
tesseract eurotext.tif euro
識別結果
euro.txt
The (quick) [brown] {fox} jumps!
Over the $43,456.78 <lazy> #90 dog
& duck/goose, as 12.5% of E-mail
from [email protected] is spam.
Der ,,schnelle” braune Fuchs springt
fiber den faulen Hund. Le renard brun
«rapide» saute par-dessus le chien
paresseux. La volpe marrone rapida
salta sopra il cane pigro. El zorro
marrén répido salta sobre el perro
perezoso. A raposa marrom répida
salta sobre 0 C50 preguicoso.
有些字符不是特別準確,還需要訓練
編程使用
通過寫代碼調用tesseract的C++ api的形式
創建vs2015 C++工程
源碼
main.cpp
#include "baseapi.h"
#include "allheaders.h"
int main()
{
char *outText;
tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
// Initialize tesseract-ocr with English, without specifying tessdata path
if (api->Init(NULL, "eng"))
{
fprintf(stderr, "Could not initialize tesseract.\n");
exit(1);
}
// Open input image with leptonica library
Pix *image = pixRead("./eurotext.tif");
api->SetImage(image);
// Get OCR result
outText = api->GetUTF8Text();
printf("---- OCR output:---- \n%s", outText);
// Destroy used object and release memory
api->End();
delete[] outText;
pixDestroy(&image);
return 0;
}
配置
頭文件包含目錄
主要是leptonica和tesseract的src目錄
附加庫目錄
需要配置leptonica和tesseract的lib路徑
附加依賴項
運行
將項目依賴的tiff,leptonica,tesseract的dll全部拷貝到exe執行目錄,並且拷貝tessdata和用到的圖片到該目錄
運行結果
---- OCR output:----
The (quick) [brown] {fox} jumps!
Over the $43,456.78 <lazy> #90 dog
& duck/goose, as 12.5% of E-mail
from [email protected] is spam.
Der ,,schnelle鈥?braune Fuchs springt
鏗乥er den faulen Hund. Le renard brun
蘆rapide祿 saute par-dessus le chien
paresseux. La volpe marrone rapida
salta sopra il cane pigro. El zorro
marr茅n r茅pido salta sobre el perro
perezoso. A raposa marrom r茅pida
salta sobre 0 C50 preguicoso.
可以看出,api識別的結果還是有些不準確的,有待訓練優化